Powershell 如何将局部变量传递给远程“调用命令”?

Powershell 如何将局部变量传递给远程“调用命令”?,powershell,powershell-remoting,powershell-4.0,Powershell,Powershell Remoting,Powershell 4.0,我正在尝试使用Invoke命令检索位于远程服务器上的文件的哈希。当我给出如下完整路径时,它可以正常工作: Invoke-Command -ComputerName winserver -ScriptBlock { Get-FileHash -Path E:\test\testfile.zip -Algorithm SHA1 } Invoke-Command -ComputerName winserver -ScriptBlock { Get-FileHash -Path

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

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path E:\test\testfile.zip -Algorithm SHA1 
}
Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path "E:\test\$dest.zip" -Algorithm SHA1 
}
但我需要通过变量传递文件名,如下所示:

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path E:\test\testfile.zip -Algorithm SHA1 
}
Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path "E:\test\$dest.zip" -Algorithm SHA1 
}
如何在远程会话的
脚本块
中访问此变量?

在PowerShell 4(实际上是3+中)最简单的方法是使用:

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

Invoke-Command -ComputerName winserver -ScriptBlock {
    param($myDest)

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

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

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

  • PSv3+提供了在脚本块中直接使用局部变量的功能——请参阅briantist的第一个命令

    • 请注意,
      使用:
      仅在
      调用命令
      实际以远程计算机为目标时有效,例如使用
      -ComputerName
      参数
  • 早期版本中唯一有效的选项是将局部变量作为参数传递给脚本块。-请参阅briantist的第二个命令