'How do I pass a local variable to a remote `Invoke-Command`? [duplicate]
I'm trying to retrieve the hash of a file located on remote server using Invoke-Command. It works fine when I give the full path as below:
Invoke-Command -ComputerName winserver -ScriptBlock {
Get-FileHash -Path E:\test\testfile.zip -Algorithm SHA1
}
But I need to pass the file name via a variable as below:
Invoke-Command -ComputerName winserver -ScriptBlock {
Get-FileHash -Path "E:\test\$dest.zip" -Algorithm SHA1
}
How do I access this variable in the scriptblock of a remote session?
Solution 1:[1]
In PowerShell 4 (3+ actually) the easiest way is to use the Using scope modifier:
Invoke-Command -ComputerName winserver -ScriptBlock {
Get-FileHash E:\test\$Using:dest.zip -Algorithm SHA1
}
For a solution that works with all versions:
Invoke-Command -ComputerName winserver -ScriptBlock {
param($myDest)
Get-FileHash E:\test\$myDest.zip -Algorithm SHA1
} -ArgumentList $dest
Solution 2:[2]
To complement briantist's helpful answer:
The script block passed to Invoke-Command is (as intended) executed on the remote machine, using the remote machine's variables by default.
Thus, in order to use a local variable's value,[1] extra steps are needed (to put it differently: inside a script block executed remotely, you cannot just refer to local variables as you normally would, such as with $dest):
PS v3+ offers the
using:scope modifier for direct use of a local variable's value inside the script block - see briantist's first command.- Note that
using:only works whenInvoke-Commandactually targets a remote machine, such as with the-ComputerNameparameter.
- Note that
The only option that also works in earlier versions is to pass the local variable as a parameter to the script block. - see briantist's second command.
[1] Note that you fundamentally cannot pass a variable itself, i.e. you cannot assign to a local variable in a remote script block.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Maximilian Burszley |
| Solution 2 |
