关于powershell:如何将局部变量传递给远程`Invoke-Command`?

How do I pass a local variable to a remote `Invoke-Command`?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试使用Invoke-Command检索位于远程服务器上的文件的哈希。当我给出如下完整路径时,它可以正常工作:

1
2
3
Invoke-Command -ComputerName winserver -ScriptBlock {
    Get-FileHash -Path E:\\test\\testfile.zip -Algorithm SHA1
}

但是我需要通过一个变量来传递文件名,如下所示:

1
2
3
Invoke-Command -ComputerName winserver -ScriptBlock {
    Get-FileHash -Path"E:\\test\\$dest.zip" -Algorithm SHA1
}

如何在远程会话的scriptblock中访问此变量?


在PowerShell 4(实际上是3)中,最简单的方法是使用Using范围修饰符:

1
2
3
Invoke-Command -ComputerName winserver -ScriptBlock {
    Get-FileHash E:\\test\\$Using:dest.zip -Algorithm SHA1
}

对于适用于所有版本的解决方案:

1
2
3
4
5
Invoke-Command -ComputerName winserver -ScriptBlock {
    param($myDest)

    Get-FileHash E:\\test\\$myDest.zip -Algorithm SHA1
} -ArgumentList $dest

为补充briantist的有用答案:

默认情况下,使用远程计算机的变量在远程计算机上执行传递给Invoke-Command的脚本块(按预期)。

因此,为了使用局部变量(值),需要执行额外的步骤(换句话说:在远程执行的脚本块中,您不能像通常那样仅引用局部变量,例如):

  • PS v3提供了using:范围修饰符,可直接在脚本块内使用局部变量-请参见briantist的第一个命令。

    • 请注意,using:仅在Invoke-Command实际上以诸如-ComputerName参数为目标的远程计算机为目标时才起作用。
  • 在早期版本中也唯一可行的选项是将局部变量作为参数传递给脚本块。 -请参阅briantist的第二个命令。