2012-10-11 15 views
6

Ti prego, dimmi che ho un sottile errore nel mio codice qui e che questo non è in realtà il modo in cui opera PowerShell.PowerShell considera stringa vuota come equivalente al nulla in istruzioni switch, ma non se le dichiarazioni

$in = "" 

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

Tutto bene, la logica onesto dice che questo script non dovrebbe mai stampare "Questo è impossibile". Ma lo fa, se $ in è una stringa vuota. Quindi in Powershell sembrerebbe che una stringa vuota e una stringa null siano considerate equivalenti in una dichiarazione switch ma non in una dichiarazione if. Questo è quindi confuso ed è uno dei motivi principali per cui molte persone evitano l'uso di Powershell.

Qualcuno può illuminarmi sul motivo per cui questo è il caso? Qualcuno sa quale interruttore sta effettivamente facendo dietro le quinte? Non sta certamente facendo un confronto diretto -eq.

+0

vedi qui - http://rkeithhill.wordpress.com/2007/01/06/checking-for-a-null-or-empty-string/ –

+0

Non si dovrebbe mai bisogno di avere 'switch' controllo per null. Non ne ho mai avuto uno nel mio codice VB.NET. – Neolisk

risposta

8

PowerShell auto-magicamente getta una $ null su una stringa vuota. Di conseguenza, quando si usa $ null su una chiamata API .NET, Powershell lo lancia in realtà su una stringa vuota. Per passare un valore nullo effettivo in una chiamata API, utilizzare invece [NullString] :: Value.

+0

Questo è vero solo se si costringe $ null a un valore [stringa]. Questa coercizione si verifica implicitamente quando si chiama una funzione con un parametro stringa tipizzato esplicito. – Timbo

+3

Si noti inoltre che '[NullString] :: Value -eq $ null' restituisce False. Avrai bisogno di confrontare la stringa con '[NullString] :: Value' ... che lo rende spesso poco pratico. È più facile usare '[stringa] :: IsNullOrEmpty()' e '[string] :: IsNullOrWhiteSpace()' per il confronto delle stringhe, ma ciò significa che '' ''è una stringa nulla. Se stai lavorando con SQL, questo può complicare la vita, specialmente perché per questo spesso dovrai usare '[System.DBNull] :: Value', che non è uguale a' $ null' e non è uguale a '[NullString] :: Value'. –

+0

Questo è fantastico - ho passato ore con una classe che stava rovinando convertTo-Json producendo una stringa vuota invece di una stringa nulla. –

5

credo sia un bug di PowerShell 2.0 (qui alcune informazioni su MSFT Connect).

posso dire che in v 3.0 ritorni codice out here!

+0

Questo è corretto - sembra che fosse un bug nella v2. – Richiban

0

le istruzioni seguenti mostrano che $null non è equivalente alla stringa vuota in un'istruzione switch.

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

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

Sorprendentemente, il secondo blocco del codice esegue _two branches_ dell'istruzione switch ... Stampa sia "null" che "empty string"! – Richiban

+0

Non così sorprendente - nessuna istruzione di interruzione, quindi l'esecuzione passa al caso successivo. – Zastai

Problemi correlati