2011-10-03 14 views
11

Próbuję dowiedzieć się PowerShell i próbował skonstruować if else:PowerShell: jak uzyskać, jeśli konstruuje się poprawnie?

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

ta kończy się na „nie widać”, chociaż istnieje procesy svchost. Jak zmodyfikować, aby uzyskać poprawne wyniki?

Odpowiedz

10

Twój if-else konstrukt jest doskonały, ale zmienić jeśli warunek jak poniżej:

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

Początkowo pan porównanie obiektu do „svchost”, który będzie oceniał na false. Za pomocą flagi -expandProperty uzyskujesz tę właściwość obiektu, która jest łańcuchem i można ją poprawnie porównać do "svchost".

Należy zauważyć, że w powyższym przypadku porównuje się tablicę ciągów znaków, która zawiera nazwę procesu, z "svchost". W przypadku tablic -eq jest prawdą, jeśli tablica zawiera inne wyrażenie, w tym przypadku „svchost”

Istnieją inne „lepsze” sposoby sprawdzenia, a także:

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

można po prostu poprosić Pobierz - Przetwórz proces, którego szukasz:

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

Ale to spowoduje błąd, jeśli nie będzie żadnego procesu. Dlatego nie sugerowałem tego. Lub skomplikuj go za pomocą 'silentlycontinue' – manojlds

+0

Powinienem był to dodać sam. W każdym razie jest to inny sposób na wprowadzenie użytkownika do opcji ErrorAction. –

+0

Wskazówka dla osób, które jeszcze nie były do ​​tego przyzwyczajenia: '-ArrorAction SilentlyContinue' można skracać do' -ea 0'. Doskonały do ​​gry w golfa i interaktywnego wykorzystania, jeśli jej potrzebujesz. Nie używaj go jednak w skryptach. – Joey

Powiązane problemy