I am trying to execute a simple Test-Path
query to a remote computer using Invoke-Command
, but I am struggling with a strange error.
This w
You have to pass local variables used in the script block through the -ArgumentList parameter:
$p_FileName = "c:\windows\system.ini"
Invoke-Command -ComputerName COMPUTER001 -ScriptBlock {Test-Path -Path $args[0]} -ArgumentList $p_FileName
Alternatives to @kevmar and @mjolinor (works for PS4 at least):
$p_FileName = "c:\windows\system.ini"
$sb = [scriptblock]::create("Test-Path $p_FileName")
Invoke-Command -ComputerName COMPUTER001 -ScriptBlock $sb
$p_FileName gets resolved on the local machine so COMPUTER001 receives
Test-Path c:\windows\system.ini
You have a scope issue. The scope within the script block that runs on the remote server cannot access your local variables. There are several ways around this. My favorite is the $Using: scope but a lot of people do not know about it.
$p_FileName = "c:\windows\system.ini"
Invoke-Command -ComputerName COMPUTER001 -ScriptBlock {Test-Path -Path $Using:p_FileName}
For invoke command, this lets you use local variables in the script block. This was introduced for use in workflows and can also be used in DSC script blocks.