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

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

我正在尝试使用 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 中访问此变量?

在 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

补充 briantist's helpful answer:

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

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

  • PS v3+ 提供 using: scope modifier 用于 在脚本块内直接使用局部变量的值 - 查看 briantist 的第一个命令。

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


[1] 请注意,您根本无法传递变量 自身 ,即您无法 分配给 本地变量远程脚本块中的变量。