在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函数将可用。