我有一个.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


当前回答

当然可以在脚本文件中定义函数(然后我倾向于在加载时通过Powershell配置文件加载它们)。

首先,你需要通过运行以下命令来确保函数已经加载:

ls function:\ | where { $_.Name -eq "A1"  }

并检查它是否出现在列表中(应该是一个1的列表!),然后让我们知道您得到了什么输出!

其他回答

假设我在路径C:\Temp\TestScript.sp1下创建了一个脚本

这些脚本中的脚本和函数遵循作用域规则。

当您使用调用操作符(&)在powershell编辑器中执行脚本文件时,它也不会添加到powershell编辑器的当前作用域,如下所示

假设您有一个名为Dummy-Name的模块文件。psm1有一个方法叫Function-Dumb()

Import-Module "Dummy-Name.psm1";
Get-Command -Module "Function-Dumb";
#
#
Function-Dumb;

如果你的文件只有一个你想调用/暴露的主函数,那么你也可以用:

Param($Param1)

然后你可以像下面这样叫它e.g.:

.\MyFunctions.ps1 -Param1 'value1'

如果您想轻松地调用该函数而不需要导入该函数,这将使它更加方便。

你可以添加函数到:

c:\Users\David\Documents\WindowsPowerShell\profile.ps1

该功能将可用。

。“PSScriptRoot美元\ MyFunctions ps1。” MyA1Func

从v3开始可用,在此之前请参阅如何获得PowerShell脚本的文件系统位置?。这很常见。

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