我觉得我缺少一些显而易见的东西,但我只是不知道该怎么做。
我有一个ps1脚本,其中定义了一个功能。它调用该函数,然后尝试远程使用它:
function foo
{
Param([string]$x)
Write-Output $x
}
foo "Hi!"
Invoke-Command -ScriptBlock { foo "Bye!" } -ComputerName someserver.example.com -Credential someuser@example.com
这个简短的示例脚本显示“Hi!”。然后崩溃,并说“术语'foo'不被识别为cmdlet,函数,脚本文件或可运行程序的名称”。
我知道该函数未在远程服务器上定义,因为它不在ScriptBlock中。我可以在那里重新定义它,但我不想。我想一次定义该函数,然后在本地或远程使用它。有什么好方法吗?
最佳答案
您需要传递函数本身(而不是ScriptBlock
中的函数调用)。
我上周有同样的需求,发现this SO discussion
因此,您的代码将变为:
Invoke-Command -ScriptBlock ${function:foo} -argumentlist "Bye!" -ComputerName someserver.example.com -Credential someuser@example.com
请注意,使用此方法,只能将参数位置传递给函数。您不能像在本地运行函数时那样使用命名参数。
关于powershell - 使用PowerShell的Invoke-Command进行远程处理时,如何包含本地定义的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367367/