如何使用Invoke-Command将局部变量传递给在远程计算机上执行的脚本块?

Bos*_*ose 8 powershell powershell-remoting powershell-4.0

我正在尝试检索位于远程服务器中的文件的Filehash Invoke-Command.我在powershell版本4上运行我的脚本.当我给出完整路径如下时,它工作正常:

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path E:\test\testfile.zip -Algorithm SHA1 
}
Run Code Online (Sandbox Code Playgroud)

以上命令有效.但是我需要通过变量传递文件名,如下所示:

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash -Path "E:\test\$dest.zip" -Algorithm SHA1 
}
Run Code Online (Sandbox Code Playgroud)

我是脚本和PowerShell的新手.请帮我解决这个问题!

bri*_*ist 19

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

Invoke-Command -ComputerName winserver -ScriptBlock { 
    Get-FileHash E:\test\$Using:dest.zip -Algorithm SHA1 
}
Run Code Online (Sandbox Code Playgroud)

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

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

    Get-FileHash E:\test\$myDest.zip -Algorithm SHA1 
} -ArgumentList $dest
Run Code Online (Sandbox Code Playgroud)


mkl*_*nt0 8

为了补充 briantist的有用的答案:

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

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

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

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

有关更多信息,请参阅在线文档Get-Help about_Remote_Variables文档.