2011-10-03 13 views
11

我努力學習的PowerShell並試圖構建的if else語句:PowerShell:如何獲得其他構造是否正確?

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

這最終成了「沒見過」,雖然有SVCHOST進程。如何修改此以獲得正確的結果?

回答

10

你的if-else結構是完美的,但是改變,如果條件象下面這樣:

(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

你可以簡單地問獲取 - 進程以獲得您之後的進程:

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

但是,如果沒有進程存在,則會發生錯誤。這就是爲什麼我沒有建議。或者'悄悄地繼續'使其複雜化' – manojlds

+0

我應該自己補充一下。無論如何,這是將用戶引入ErrorAction選項的另一種方式。 –

+0

只是提示尚未習慣的用戶:'-ErrorAction SilentlyContinue'可以縮寫爲'-ea 0'。非常適合高爾夫和互動使用,如果你需要的話。不過,不要在腳本中使用它。 – Joey

相關問題