Invoke-Command不接受-Path作为变量

时间:2015-01-09 15:17:16

标签: powershell

我正在尝试使用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),但没有运气。

有任何建议,希望能解释发生的事情吗?

3 个答案:

答案 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