我有一个.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时,我只是得到一个错误,说明没有该名称的命令/函数:
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的一些概念。我不能在脚本文件中定义函数吗?
注意,我已经将我的执行策略设置为“remotessigned”。我知道运行。ps1文件时,在文件名前加一个点:.\myFile.ps1
你正在谈论的是所谓的点来源。这是邪恶的。但是不用担心,有一种更好更简单的方法可以用模块来做你想做的事情(听起来比实际要可怕得多)。使用模块的主要好处是,如果需要,您可以从shell中卸载它们,并且它可以防止函数中的变量渗透到shell中(一旦您点源了一个函数文件,尝试从shell中的函数调用其中一个变量,您就会明白我的意思)。
因此,首先,将包含所有函数的.ps1文件重命名为MyFunctions。Psm1(您刚刚创建了一个模块!)现在要正确加载一个模块,您必须对文件做一些特定的事情。首先,Import-Module要查看模块(使用这个cmdlet将模块加载到shell中),它必须位于特定的位置。模块文件夹的默认路径是$home\Documents\WindowsPowerShell\ modules。
在该文件夹中,创建一个名为MyFunctions的文件夹,并放置MyFunctions。模块文件必须位于与psm1文件名称完全相同的文件夹中。
一旦完成,打开PowerShell,并运行以下命令:
Get-Module -listavailable
如果您看到一个名为MyFunctions的模块,则说明您做对了,您的模块已经准备好加载了(这只是为了确保设置正确,您只需要这样做一次)。
要使用模块,在shell中输入以下内容(或将这一行放在$profile中,或将其作为脚本中的第一行):
Import-Module MyFunctions
现在可以运行函数了。很酷的一点是一旦你有了10-15个函数,你就会忘记其中一些函数的名字。如果你在一个模块中有它们,你可以运行下面的命令来获得模块中所有函数的列表:
Get-Command -module MyFunctions
这是非常甜蜜的,它需要在正面设置的一点点努力是值得的。
你正在谈论的是所谓的点来源。这是邪恶的。但是不用担心,有一种更好更简单的方法可以用模块来做你想做的事情(听起来比实际要可怕得多)。使用模块的主要好处是,如果需要,您可以从shell中卸载它们,并且它可以防止函数中的变量渗透到shell中(一旦您点源了一个函数文件,尝试从shell中的函数调用其中一个变量,您就会明白我的意思)。
因此,首先,将包含所有函数的.ps1文件重命名为MyFunctions。Psm1(您刚刚创建了一个模块!)现在要正确加载一个模块,您必须对文件做一些特定的事情。首先,Import-Module要查看模块(使用这个cmdlet将模块加载到shell中),它必须位于特定的位置。模块文件夹的默认路径是$home\Documents\WindowsPowerShell\ modules。
在该文件夹中,创建一个名为MyFunctions的文件夹,并放置MyFunctions。模块文件必须位于与psm1文件名称完全相同的文件夹中。
一旦完成,打开PowerShell,并运行以下命令:
Get-Module -listavailable
如果您看到一个名为MyFunctions的模块,则说明您做对了,您的模块已经准备好加载了(这只是为了确保设置正确,您只需要这样做一次)。
要使用模块,在shell中输入以下内容(或将这一行放在$profile中,或将其作为脚本中的第一行):
Import-Module MyFunctions
现在可以运行函数了。很酷的一点是一旦你有了10-15个函数,你就会忘记其中一些函数的名字。如果你在一个模块中有它们,你可以运行下面的命令来获得模块中所有函数的列表:
Get-Command -module MyFunctions
这是非常甜蜜的,它需要在正面设置的一点点努力是值得的。