2011-10-03 10 views
11

Sto cercando di imparare powershell e ha cercato di costruire un se else:PowerShell: come ottenere se else costruisce correttamente?

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

Questo finisce in "non si vedono", anche se c'è processi svchost. Come modificare questo per ottenere risultati corretti?

risposta

10

tuo costrutto if-else è perfetto, ma se cambia la condizione come di seguito:

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

Inizialmente di comparare un oggetto al "svchost" che valuterà su false. Con il flag -expandProperty, si ottiene la proprietà dell'oggetto, che è una stringa e può essere correttamente confrontata con "svchost".

Si noti che in quanto sopra si confronta la matrice di stringhe, che contiene il nome del processo, in "svchost". In caso di array -eq è vero se l'array contiene l'altra espressione, in questo caso il "svchost"

Ci sono altri "migliori" modi per controllare così:

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

Si può semplicemente chiedere Get -Processo per ottenere il processo che stai cercando:

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

Ma questo darà errore se nessun processo è presente. Ecco perché non l'ho suggerito. O complicarlo con 'silentlycontinue' – manojlds

+0

Avrei dovuto aggiungerlo io stesso. Ad ogni modo, è un altro modo per introdurre l'utente all'opzione ErrorAction. –

+0

Solo un suggerimento per le persone non ancora abituate: '-ErrorAction SilentlyContinue' può essere abbreviato in' -ea 0'. Ottimo per il golf e l'uso interattivo, se ne hai bisogno. Non usarlo negli script, però. – Joey

Problemi correlati