PowerShell: как получить правильную конструкцию if else?

#powershell #if-statement #conditional #powershell-2.0

#powershell #if-statement #условные операторы #powershell-2.0

Вопрос:

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

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

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

Ответ №1:

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

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

Первоначально вы сравнивали объект с «svchost», который будет иметь значение false. С -expandProperty помощью флага вы получаете это свойство объекта, которое является строкой и может быть правильно сопоставлено с «svchost».

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

Существуют и другие «лучшие» способы проверки:

 if (Get-Process | ?{ $_.Name -eq "svchost"}) {
  Write-Host "seen"
}
else {
  Write-Host "not seen"
}
  

Ответ №2:

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

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

Комментарии:

1. Но это приведет к ошибке, если никакого процесса не существует. Вот почему я этого не предлагал. Или усложнить его с помощью silentlycontinue

2. Я должен был добавить это сам. В любом случае, это еще один способ познакомить пользователя с опцией ErrorAction.

3. Просто подсказка для людей, которые еще не привыкли к этому: -ErrorAction SilentlyContinue может быть сокращено до -ea 0 . Отлично подходит для игры в гольф и интерактивного использования, если вам это нужно. Однако не используйте его в сценариях.