2012-02-27 46 views
4

我有一個的意思殺死在遠程機器上一定的流程如下微小PowerShell腳本:Powershell的停止進程空PARAM

$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} 
} 

不過,我發現了以下錯誤:

Cannot bind argument to parameter 'Id' because it is null.

據我所知,管道不應該被任何事情打斷,所以我不太確定我要出錯的地方。

回答

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 
+0

感謝。我真的很喜歡你的壓縮版本的腳本,遠遠減少遠程調用的速度(它可以通過高延遲鏈接運行)。 – 2012-02-27 22:34:46

2

您需要將變量thisId作爲參數傳遞給腳本塊(Invoke-Command在針對遠程計算機運行時在單獨的臨時會話中執行腳本塊,因此局部變量不在作用域中)。嘗試,因爲:

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