2015-04-19 17 views
6

Data questa funzione di base:parametro vuoto non è nullo in funzione

Function TestFunction { 
    Param ([int]$Par1, [string]$Par2, [string]$Par3) 
    If ($Par1 -ne $Null) { Write-Output "Par1 = $Par1" } 
    If ($Par2 -ne $Null -or $Par2 -ne '') { Write-Output "Par2 = $Par2" } 
    If ($Par3 -ne $Null) { Write-Output "Par3 = $Par3" } 
} 
TestFunction -Par1 1 -Par3 'par3' 

... l'output è:

Par1 = 1 
Par2 = 
Par3 = par3 

Anche se non ho passare nulla nella variabile $Par2, si ancora non è Nullo o vuoto. Cosa è successo e come posso riscrivere l'istruzione in modo che la seconda istruzione If valuti come False e il blocco di script non venga eseguito?

(ho aggiunto il -or $Par2 -ne '' solo per prova, si comporta lo stesso con e senza di essa.)

risposta

10

Hai un errore logico nel programma: $Par2 sarà sempre essere diverso da $nullo non uguale a ''.

Per fissare la logica, si dovrebbe usare -and invece di -or qui:

If ($Par2 -ne $Null -and $Par2 -ne '') { Write-Output "Par2 = $Par2" } 

Tuttavia, poiché si colato l'argomento $Par2 in una stringa nella lista degli argomenti della funzione:

Param ([int]$Par1, [string]$Par2, [string]$Par3) 
        ^^^^^^^^ 

la controllare $Par2 -ne $Null non è necessario poiché $Par2 sarà sempre di tipo stringa (se non gli si assegna un valore, verrà assegnato a ''). Quindi, si dovrebbe effettivamente scrivere:

If ($Par2 -ne '') { Write-Output "Par2 = $Par2" } 

Oppure, perché '' restituisce false, si potrebbe anche fare:

If ($Par2) { Write-Output "Par2 = $Par2" } 
+0

E 'stato veloce. Ma cosa è IN '$ Par2'? Se passo un valore in esso, '$ Par2 -ne $ Null' sarà vero. Ma se non ci passo niente $ $ Par2 -ne $ Null' dovrebbe essere falso e non dovrebbe essere eseguito, giusto? Eppure, lo fa ... – Mark

+0

Vedere la mia modifica. '$ Par2' sarà sempre una stringa perché l'hai inserita in una lista di argomenti della funzione. Inoltre, per il futuro, puoi ottenere il tipo di qualsiasi variabile usando il metodo 'GetType':' $ Par2.GetType() '. Ciò sarà di grande aiuto nel debugging. – iCodez

+0

Quindi, poiché l'ho lanciato nel blocco parametri, esisterà sempre e quindi non sarà mai nullo? Anche se dovessi cambiare il valore predefinito in null ('[stringa] $ Par2 = $ Null')? E un intero sarà sempre 0? Quindi se dovessi passare nulla in '$ par1', allora' If ($ Par1) 'sarà vero perché contiene 0? Quindi, nel cercare di scrivere uno script migliore lanciando i tipi di variabile, in realtà l'ho reso più difficile per me stesso. – Mark

Problemi correlati