2012-10-11 42 views
6

Por favor, dime que tengo un error sutil en mi código aquí y que esta no es la forma en que opera Powershell.Powershell trata cadena vacía como equivalente a nulo en instrucciones de conmutación, pero no si las declaraciones

$in = "" 

if ($in -ne $null) 
{ 
    switch ($in) 
    { 
     $null { echo "This is impossible" } 
     default { echo "out here!" } 
    } 
} 

Todo bien, la lógica honesto dice que este script no debe imprimir "Esto es imposible". Pero lo hace, si $ in es una cadena vacía. Por lo tanto, en Powershell parecería que una cadena vacía y una cadena null se consideran equivalentes en una declaración switch pero no en una declaración if. Esto es por lo que es confuso y es una de las razones principales por las que muchas personas evitan usar Powershell.

¿Alguien me puede aclarar por qué este es el caso? ¿Alguien sabe qué cambio está haciendo detrás de escena? Ciertamente no está haciendo una comparación recta -eq.

+0

Ver aquí - http://rkeithhill.wordpress.com/2007/01/06/checking-for-a-null-or-empty-string/ –

+0

Nunca se debe necesita tener 'switch' comprobación para nulos. Nunca tuve uno en mi código VB.NET. – Neolisk

Respuesta

8

Powershell auto-mágicamente $ proyecta una nula a una cadena vacía. En consecuencia, al usar $ null en una llamada API .NET, Powershell en realidad lo arroja a una cadena vacía. Para pasar un valor nulo real en una llamada API, use [NullString] :: Value en su lugar.

+0

Esto solo es cierto si coacciona $ null a un valor de [cadena]. Esta coerción ocurre implícitamente cuando se llama a una función con un parámetro explícito de tipo cadena. – Timbo

+3

También tenga en cuenta que '[NullString] :: Value -eq $ null' devuelve False. Tendrá que comparar la cadena con '[NullString] :: Value' ... lo que a menudo lo hace poco práctico. Es más fácil usar '[cadena] :: IsNullOrEmpty()' y '[cadena] :: IsNullOrWhiteSpace()' para la comparación de cadenas, pero eso significa '''' es una cadena nula. Si estás trabajando con SQL, esto puede complicarte la vida, especialmente porque para eso a menudo necesitarás usar '[System.DBNull] :: Value', que tampoco es igual a' $ null' y no es igual a '[NullString] :: Value'. –

+0

Esto es fantástico: he pasado horas con una clase que estaba arruinando convertTo-Json al generar una cadena vacía en lugar de una cadena nula. –

5

Creo que es un error de powershell 2.0 (aquí información sobre MSFT Connect).

me puede decir que en v 3.0 código de retorno que out here!

+0

Esto es correcto, parece que fue un error en v2. – Richiban

0

Las siguientes afirmaciones muestran que $null no es equivalente a la cadena vacía en una instrucción switch.

$a=""; switch ($a){$null {"null"} "" {"empty string"}} 

$a=$null; switch ($a){$null {"null"} "" {"empty string"}} 
+0

Sorprendentemente, el segundo bloque de su código ejecuta _dos ramas_ de la declaración de cambio ... ¡Imprime tanto "nulo" como "cadena vacía"! – Richiban

+0

No es tan sorprendente, no hay declaración de interrupción, por lo que la ejecución cae en el siguiente caso. – Zastai

Cuestiones relacionadas