PowerShell: как получить, если еще правильно построить? - PullRequest
11 голосов
/ 03 октября 2011

Я пытаюсь изучить PowerShell и попытался создать оператор if else:

if ((Get-Process | Select-Object name) -eq "svchost") {
    Write-Host "seen"
    }
    else {
    Write-Host "not seen"
    }

Это заканчивается "не видно", хотя есть процессы svchost. Как изменить это, чтобы получить правильные результаты?

Ответы [ 2 ]

10 голосов
/ 03 октября 2011

Ваша конструкция if-else идеальна, но измените условие if, как показано ниже:

(Get-Process | Select-Object -expand name) -eq "svchost"

Первоначально вы сравнивали объект с "svchost", который оценивается как ложный. С флагом -expandProperty вы получаете то свойство объекта, которое является строкой и может быть правильно сопоставлено с "svchost".

Обратите внимание, что в приведенном выше примере вы сравниваете массив строк, содержащий имя процесса, с svchost. В случае массивов -eq имеет значение true, если массив содержит другое выражение, в этом случае «svchost»

Есть и другие "лучшие" способы проверки:

if (Get-Process | ?{ $_.Name -eq "svchost"}) {
  Write-Host "seen"
}
else {
  Write-Host "not seen"
}
2 голосов
/ 03 октября 2011

Вы можете просто попросить Get-Process получить процесс, который вам нужен:

if (Get-Process -Name svchost -ErrorAction SilentlyContinue) 
{
  Write-Host "seen"
}
else 
{
  Write-Host "not seen"
}
...