#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
. Отлично подходит для игры в гольф и интерактивного использования, если вам это нужно. Однако не используйте его в сценариях.