说我有两个脚本:
脚本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
答案 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上看到不同的结果。)