无法使用另一个 powershell 文件中的函数

Not able to use a function from another powershell file

我在 main.ps1 file 中导入另一个文件 $dirpath\new.ps1,如下所示:

Import-module $dirpath\new.ps1 -force -ErrorAction SilentlyContinue -WarningAction SilentlyContinue
try {
    $getval = invoke-command -cn $host -Credential $cred -ScriptBlock {
    param($name)    
    get-myfunc $name
    } -ArgumentList $name
    
} catch { 
    ...
    }

main.ps1 filenew.ps1 都存在于同一目录下 - $dirpath.

new.ps1 如下所示:

Function global:get-myfunc{
PARAM(
    [Parameter(Mandatory=$true,Position=0)][STRING]$name
)
    write-host "$name"

}

现在,main.ps1 file 抛出以下错误:

+     $getval = invoke-command -cn $host -Credential $cred -S ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (get-myfunc:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

我尝试将 new.ps1 重命名为 new.psm1,然后将模块导入为 Import-module $dirpath\new.psm1,但它仍然失败并出现相同的错误。

我正在使用 poweshell 5

第一期

new.ps1 文件不是模块,只是一个常规脚本,因此您不能t/shouldn不能为此使用 Import-Module

模块不仅仅是具有不同扩展名的脚本。有关详细信息,请参阅:

如果您想保留当前设置,dot source 脚本,方法是将 Import-Module 行替换为:

. $dirpath\new.ps1

这将执行脚本并在当前范围内定义函数。

如果脚本与调用脚本位于同一文件夹中,您可以使用 $PSScriptRoot:

进一步简化语句
. $PSScriptRoot\new.ps1

第二期

Invoke-Command 表示您是 运行 不同主机上的脚本块,这意味着它使用不同的范围。这就是它找不到 get-myfunc 函数的原因。

将您的声明修改为:

Invoke-Command 
    -ComputerName $host `
    -Credential $cred `
    -ScriptBlock ${Function:get-myfunc} `
    -ArgumentList $name

更详细的解释见Run Local Functions Remotely in PowerShell

那行不通,因为您正在将该模块导入本地计算机。但是,下面的命令正在远程机器上执行。这意味着您需要在远程机器上安装该模块,然后您可以在远程机器上使用该模块。

$getval = invoke-command -cn $host -Credential $cred -ScriptBlock { 参数($名称)
get-myfunc $名字

请按照下面link解决