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

时间:2016-02-18 21:08:27

标签: powershell powershell-remoting powershell-v4.0

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

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 
}

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

2 个答案:

答案 0 :(得分:19)

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

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

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

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

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

答案 1 :(得分:8)

补充 briantist's helpful answer

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

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

  • PS v3 + 直接使用脚本块中的局部变量提供 using:范围修饰符 - 见briantist的第一个命令。

    • 请注意,using:仅在Invoke-Command实际定位远程计算机时有效。
  • 在早期版本中也可以使用的唯一选项是将本地变量作为参数传递给脚本块。 - 请参阅briantist的第二个命令。< / p>

有关详细信息,请参阅Get-Help about_Remote_Variablesdocs online