我的脚本如何在远程会话中的另一个脚本中调用函数?

时间:2014-12-12 07:40:55

标签: powershell powershell-v3.0

说我有两个脚本:

脚本1: helper.ps1内容:

#helper.ps1
Function foo
{
    # do something
}

脚本2: worker.ps1内容:

#worker.ps1
. 'c:\helper.ps1'  # This is the correct file location, verified
Write-Output "Starting foo..."
foo
Write-Output "Done"

这两个文件已经上传到远程服务器,我尝试使用Invoke-Command远程会话来运行这些文件:

Invoke-Command -ScriptBlock {
  param($script)
  & $script
} -Args 'worker.ps1'

事实证明worker.ps1的大多数部分正常工作,在上面的示例中,我们将能够获得第1行和第3行的输出。 但是,它无法运行函数foo,例外情况说它不是函数/ script / anything,这基本上意味着helper.ps1未正确加载:

  

术语“foo”'不被识别为cmdlet,函数,脚本文件或可操作程序的名称。检查名称的拼写,或者是否包含路径。

问题是,这是预期的行为吗?我们是否可以使用远程会话控制在一个脚本中加载其他脚本,即使这两个文件都已上传并存在于远程服务器中?

调用以下命令:

Invoke-Command -ScriptBlock {param($script) & $script} -Args 'worker.ps1' .
Exception: The term 'foo' 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. I think Invoke-Command does what it does, since I got other lines executed without problem 

1 个答案:

答案 0 :(得分:1)

我搞砸了一下,发现以下工作:

worker.ps1文件:

#worker.ps1
. "c:\helper.ps1"
Write-Output "Starting foo..."
foo
Write-Output "Done"

helper.ps1文件:

#helper.ps1
Write-Host "Loading foo function..."
Function foo
{
  # do something
  Write-Host "The foo is alive!"
}
Write-Host "Foo loaded"

远程系统上的命令:

Invoke-Command -ScriptBlock {param($script) & $script} `
-ArgumentList 'c:\Worker.ps1' -ComputerName Machine

输出:

Loading foo function...
Foo loaded
Starting foo...
The foo is alive!
Done

所以它可能只是单引号而不是文件名周围的双引号的问题。我能够从两个不同的系统执行Invoke-Command块到这台机器,并且两者都有相同的结果。 (我的所有系统都运行PS v4,因此您可能会在PS v3上看到不同的结果。)