在foreach循环中调用时,Powershell Stop-Process null参数

时间:2012-02-27 21:02:57

标签: powershell powershell-remoting

我有以下微小的PowerShell脚本,它意味着杀死远程计算机上的某些特定进程:

$destPS = "mywebserver1"
$brokerPIDs = Get-Process -ComputerName $destPS | ?{$_.processname -eq "uniRQBroker" -or $_.processname -eq "uniRTE"}
foreach ($process in $brokerPIDs){
    $thisId = $process.ID
    Write-Host "Killing PID $thisId"
    Invoke-Command $destPS {Stop-Process $thisId}
}

但是,我收到以下错误:

  

无法将参数绑定到参数“Id”,因为它为null。

据我所见,管道不应该被任何东西打断,所以我不太确定我哪里出错了。

2 个答案:

答案 0 :(得分:2)

您需要将变量thisId作为参数传递给scriptblock(Invoke-Command在针对远程计算机运行时在单独的临时会话中执行scriptblock,因此局部变量不再在范围内) 。试一试:

Invoke-Command $destPS {Stop-Process $args} -ArgumentList $thisID

答案 1 :(得分:2)

脚本块未获取$thisId并且设置为null。所以stop-process给出了错误。您可以将参数传递给脚本块,如@Rynant提及。

由于您所做的只是获取进程并终止符合您要求的进程,因此将命令移动到脚本块中并使用远程盒上的Invoke-Command执行整个脚本块:

$script = {Get-Process -name uniRQBroker,uniRTE  | stop-process -passthru | %{write-host killed pid $_.id}}

invoke-command -script $script -computer $destPS