2011-10-03 7 views
11

Estoy tratando de aprender PowerShell y trataron de construir una instrucción else if:PowerShell: cómo obtener si no construir bien?

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

Esto termina en "no se ve", aunque hay procesos svchost. ¿Cómo modificar esto para obtener resultados correctos?

Respuesta

10

Su construcción if-else es perfecto, pero si cambia el estado, como a continuación:

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

Inicialmente se estaban comparando un objeto a la "svchost" que evaluará a falso. Con la bandera -expandProperty, está obteniendo esa propiedad del objeto, que es una cadena y se puede comparar con "svchost".

Tenga en cuenta que en el punto anterior está comparando la matriz de cadenas, que contiene el nombre del proceso, a "svchost". En el caso de matrices -eq es cierto si la matriz contiene la otra expresión, en este caso el "svchost"

Hay otras maneras "mejores" para comprobar así:

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

Usted puede simplemente pedir Obtener -Proceso para obtener el proceso que está buscando:

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

Pero eso dará error si no hay ningún proceso. Es por eso que no lo sugerí. O compliquelo con 'Silentlycontinue' – manojlds

+0

Debería haberlo agregado yo mismo. De todos modos, es otra forma de presentar al usuario la opción ErrorAction. –

+0

Solo una sugerencia para las personas que aún no están acostumbradas: '-ErrorAction SilentlyContinue' se puede abreviar a' -ea 0'. Ideal para golf y uso interactivo, si lo necesita. No lo use en scripts, sin embargo. – Joey

Cuestiones relacionadas