首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在PowerShell中,如何在文件中定义函数并从PowerShell命令行调用它?

在PowerShell中,如何在文件中定义函数并从PowerShell命令行调用它?
EN

Stack Overflow用户
提问于 2011-05-16 19:04:51
回答 7查看 280.7K关注 0票数 278

我有一个.ps1文件,我想在其中定义自定义函数。

假设文件名为MyFunctions.ps1,内容如下:

代码语言:javascript
复制
Write-Host "Installing functions"
function A1
{
    Write-Host "A1 is running!"
}
Write-Host "Done"

要运行此脚本并在理论上注册A1函数,我导航到.ps1文件所在的文件夹并运行该文件:

代码语言:javascript
复制
.\MyFunctions.ps1

这将输出以下内容:

代码语言:javascript
复制
Installing functions
Done

然而,当我尝试调用A1时,我只是得到一个错误,指出没有使用该名称的命令/函数:

代码语言:javascript
复制
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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-05-16 19:22:43

在PowerShell命令行中尝试执行以下操作:

代码语言:javascript
复制
. .\MyFunctions.ps1
A1

点运算符用于脚本包含,也称为“点采购”(或"dot source notation")

票数 296
EN

Stack Overflow用户

发布于 2011-05-18 14:29:56

您正在讨论的内容称为。这是邪恶的。但不用担心,有一种更好、更简单的方法可以用做你想要做的事情(听起来比实际可怕得多)。使用模块的主要好处是,如果需要,您可以从shell中卸载它们,并且它可以防止函数中的变量悄悄进入shell (一旦您对函数文件进行了点源代码处理,尝试从shell中的函数调用其中一个变量,您就会明白我的意思)。

因此,首先,将包含所有函数的.ps1文件重命名为MyFunctions.psm1 (您刚刚创建了一个模块!)。现在,为了正确加载模块,您必须对文件执行一些特定的操作。首先,Import-Module要查看模块(使用此cmdlet将模块加载到shell中),它必须位于特定位置。模块文件夹的默认路径是$home\Documents\WindowsPowerShell\Modules。

在该文件夹中,创建一个名为MyFunctions的文件夹,并将MyFunctions.psm1文件放入其中(模块文件必须位于与PSM1文件名称完全相同的文件夹中)。

完成后,打开PowerShell,并运行以下命令:

代码语言:javascript
复制
Get-Module -listavailable

如果您看到一个名为MyFunctions的模块,那么您做得很正确,并且您的模块已经准备好加载(这只是为了确保正确设置,您只需执行一次)。

要使用该模块,请在shell中键入以下内容(或将此行放入$profile中,或将此行作为脚本的第一行):

代码语言:javascript
复制
Import-Module MyFunctions

你现在可以运行你的函数了。最酷的是,一旦你有了10-15个函数,你就会忘记一对夫妇的名字。如果模块中包含这些函数,则可以运行以下命令来获取模块中所有函数的列表:

代码语言:javascript
复制
Get-Command -module MyFunctions

这是相当甜蜜的,而且在前端设置所需的一点点努力也是值得的。

票数 263
EN

Stack Overflow用户

发布于 2015-02-05 23:33:44

. "$PSScriptRoot\MyFunctions.ps1" MyA1Func

在此之前,请参阅How can I get the file system location of a PowerShell script?,从v3开始。这是很常见的。

附注:我不同意“一切都是模块”的规则。我的脚本被GIT之外的其他开发人员使用,所以我不喜欢在脚本运行之前把东西放在特定的地方或修改系统环境变量。这只是一个脚本(或两个或三个)。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6016436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档