PowerShell: как получить, если иначе построить право?

Я пытаюсь изучить 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 истинно, если массив содержит другое выражение, в этом случае "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"
}