我正在尝试使用Test-Path
对远程计算机执行简单的Invoke-Command
查询,但我正在努力解决一个奇怪的错误。
这有效:
Invoke-Command -ComputerName COMPUTER001 -ScriptBlock {Test-Path -Path "c:\windows\system.ini"}
失败,“无法将参数绑定到参数'Path',因为它为null。”:
$p_FileName = "c:\windows\system.ini"
Invoke-Command -ComputerName COMPUTER001 -ScriptBlock {Test-Path -Path $p_FileName}
我尝试过同时使用$p_FileName
和$($p_FileName)
,但没有运气。
有任何建议,希望能解释发生的事情吗?
答案 0 :(得分:4)
您必须通过-ArgumentList参数传递脚本块中使用的局部变量:
$p_FileName = "c:\windows\system.ini"
Invoke-Command -ComputerName COMPUTER001 -ScriptBlock {Test-Path -Path $args[0]} -ArgumentList $p_FileName
答案 1 :(得分:2)
您有范围问题。在远程服务器上运行的脚本块中的范围无法访问本地变量。有几种方法可以解决这个问题。我最喜欢的是$ Using:scope,但是很多人都不知道它。
$p_FileName = "c:\windows\system.ini"
Invoke-Command -ComputerName COMPUTER001 -ScriptBlock {Test-Path -Path $Using:p_FileName}
对于invoke命令,这允许您在脚本块中使用局部变量。这是为了在工作流程中使用而引入的,也可以在DSC脚本块中使用。
答案 2 :(得分:0)
@kevmar和@mjolinor的替代品(至少适用于PS4):
$p_FileName = "c:\windows\system.ini"
$sb = [scriptblock]::create("Test-Path $p_FileName")
Invoke-Command -ComputerName COMPUTER001 -ScriptBlock $sb
$ p_FileName在本地计算机上得到解析,因此COMPUTER001收到
Test-Path c:\windows\system.ini