PowerShell自定义模块和函数范围,用于传递到远程计算机

时间:2014-09-18 10:29:06

标签: powershell powershell-remoting

根据我加载模块的方式,我在远程计算机上的自定义模块中可以使用自定义函数,从而获得了混合结果。细节如下:

我写了一个自定义模块,其中有一个单一的函数文件。结构如下:

  • C:\ PowerShell的模块\模块名
    • C:\ PowerShell的模块\ ModuleName.psd1
    • C:\ PowerShell-Modules \ MyFunction.ps1(包含一个名为MyFunction的函数)。

为了依赖模块自动加载,我修改$ env:PSModulePath以包含“C:\ PowerShell-Modules \”。

在我的脚本(例如PassRemote.ps1)中,“MyFunction”可用并按预期运行。但是,当尝试在远程计算机上运行它时:

Invoke-Command -ComputerName $computername -UseSSL -ScriptBlock ${function:MyFunction} -ArgumentList $arg1

...它失败,报告无法识别cmdlet /函数。

我可以获取要传递的自定义函数的唯一方法是在脚本中显式加载模块。要清楚,我需要写下这一行:

Import-Module ModuleName 
父脚本(PassRemote.ps1)中的

。只有这样才能将函数传递给远程会话。

这是范围问题吗?

1 个答案:

答案 0 :(得分:0)

看来显式加载模块还会加载其中的函数/ cmdlet的全部内容(即代码本身)。因此,可以完整地传递函数。

当依赖于模块的自动加载时,只加载可用cmdlet /函数的名称(显然,PS3 +在启动时加载需要很长时间)。这意味着虽然PS会话“了解”自动加载的函数,但此时它实际上并没有将代码传递给远程会话。遗憾的是,使用“-Scr​​iptBlock $ {function:MyFunction}”似乎没有强行扩展或加载此功能,以便可以通过。

为了证明上述理论(并避免明确加载模块),我们可以运行:

    $x = Get-Command MyFunction

然后:

Invoke-Command -ComputerName $computername -UseSSL -ScriptBlock ${function:MyFunction} -ArgumentList $arg1

如果在Invoke-Command行中有一些方法可以做到这一点会很好,但我认为这可能是我遇到上述情况的原因。