在PowerShell中,如何在文件中定义一个函数并从PowerShell命令行调用它?
我有一个.ps1文件,我想在其中定义自定义函数。
想象一下这个文件叫做MyFunctions.ps1,其内容如下:
Write-Host "Installing functions" function A1 { Write-Host "A1 is running!" } Write-Host "Done"
为了运行这个脚本并理论上注册A1函数,我导航到.ps1文件所在的文件夹并运行该文件:
.\MyFunctions.ps1
这输出:
Installing functions Done
然而,当我尝试打电话给A1的时候,我只是得到了错误,指出没有这个名字的命令/function:
The term 'A1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:3 + A1 <<<< + CategoryInfo : ObjectNotFound: (A1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
我必须误解一些PowerShell的概念。 我不能在脚本文件中定义函数吗?
请注意 ,我已经将我的执行策略设置为“RemoteSigned”。 我知道使用文件名前面的一个点运行.ps1文件:。\ myFile.ps1
在PowerShell命令行上试试这个:
. .\MyFunctions.ps1 A1
点运算符用于包含脚本。
你在说什么叫做点源 。 这是邪恶的。 但是不用担心,有一个更好,更简单的方法来做你想要的模块 (这听起来比它更可怕)。 使用模块的主要好处是,如果需要,可以从shell中卸载它们,并且使函数中的variables不会渗入shell(一旦你点出一个函数文件的源代码,就尝试调用一个来自在shell中的function,你会看到我的意思)。
所以首先,将其中包含所有函数的.ps1文件重命名为MyFunctions.psm1(您刚刚创build了一个模块!)。 现在要正确加载一个模块,你必须对文件做一些特定的事情。 首先让Import-Module查看模块(使用此cmdlet将模块加载到shell中),它必须位于特定的位置。 modules文件夹的默认path是$ home \ Documents \ WindowsPowerShell \ Modules。
在该文件夹中,创build一个名为MyFunctions的文件夹,并将MyFunctions.psm1文件放入其中(模块文件必须位于与PSM1文件名称完全相同的文件夹中)。
完成之后,打开PowerShell,然后运行以下命令:
Get-Module -listavailable
如果你看到一个叫做MyFunctions的对象,那么你做对了,你的模块已经准备好被加载了(这只是为了确保设置正确,你只需要做一次)。
要使用该模块,请在shell中键入以下内容(或将此行放在$ profile中,或将其作为脚本的第一行):
Import-Module MyFunctions
你现在可以运行你的function。 这很酷的事情是,一旦你有10-15个function,你会忘记一对夫妇的名字。 如果你把它们放在一个模块中,你可以运行下面的命令来得到模块中所有函数的列表:
Get-Command -module MyFunctions
这是非常可爱的,而在正面设置的一小部分努力是值得的。
. "$PSScriptRoot\MyFunctions.ps1" MyA1Func
可用性从v3开始,在此之前,请参阅如何获取PowerShell脚本的文件系统位置? 。 这是非常常见的。
PS我不订阅“一切都是模块”规则。 我的脚本被其他开发者用于GIT,所以我不喜欢把东西放在特定的地方,或者在我的脚本运行之前修改系统环境variables。 这只是一个脚本(或两个,或三个)。
您当然可以在脚本文件中定义函数(然后我倾向于在加载时通过Powershellconfiguration文件加载它们)。
首先,您需要检查以确保该function通过运行加载:
ls function:\ | where { $_.Name -eq "A1" }
并检查它是否出现在列表中(应该是1的列表!),然后让我们知道你得到什么输出!
如果你的文件只有一个你想调用/显示的主函数,那么你也可以用下面的方法启动这个文件:
Param($Param1)
然后你可以如下调用它:
.\MyFunctions.ps1 -Param1 'value1'
如果你想轻松的调用这个函数,而不必导入这个函数,这样会更加方便。
您可以将函数添加到c:\ Users \ David \ Documents \ WindowsPowerShell \ profile.ps1函数将可用。