Пустой параметр Powershell Stop-Process при вызове в цикле foreach - PullRequest
4 голосов
/ 28 февраля 2012

У меня есть следующий крошечный скрипт 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 ]

2 голосов
/ 28 февраля 2012

Блок сценария не получает $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
2 голосов
/ 28 февраля 2012

Вам необходимо передать переменную thisId в блок скриптов в качестве аргумента (Invoke-Command выполняет блок скриптов в отдельном временном сеансе при запуске на удаленном компьютере, поэтому локальные переменные больше не находятся в области видимости).Попробуйте как:

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