2011-12-29 14 views
5

Quindi, se ho il seguente codice:problemi di rinvio tabella hash

function DoSomething { 
    $site = "Something" 
    $app = "else" 
    $app 
    return @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo["site"] 

Perché non $ SiteInfo [ "sito"] ritorno "Qualcosa"?

posso affermare solo ....

$siteInfo 

e tornerà

else 

Key: site 
Value: Something 
Name: site 

Key: app 
Value: else 
Name: app 

Che cosa mi manca?

+0

'$ SiteInfo [ "sito"]' 'non tornare Something' per me. – Rynant

+0

anche per me, versione PowerShell? –

+0

Ok ho qualche informazione in più. Ho aggiunto solo una semplice chiamata su una variabile ($ app) sopra nel mio codice funzione. Quello che stava accadendo era che il valore da $ app e l'hashtable è stato restituito alla variabile che ha chiamato la funzione. Quindi se ho fatto un ($ siteInfo | fl) mostrerebbe sia "else" che le due chiavi/valori. Perché? – pghtech

risposta

12

In PowerShell, le funzioni restituiscono qualsiasi valore restituito da ciascuna riga nella funzione; non è necessaria un'istruzione esplicita return.

Procedimento String.IndexOf() restituisce un valore intero, quindi in questo esempio, DoSomething restituisce '2' e la tabella hash come array di oggetti visti con .GetType().

function DoSomething { 
    $site = "Something" 
    $app = "else" 
    $app.IndexOf('s') 
    return @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo.GetType() 

L'esempio seguente mostra 3 modi per bloccare l'uscita indesiderati:

function DoSomething { 
    $site = "Something" 
    $app = "else" 

    $null = $app.IndexOf('s') # 1 
    [void]$app.IndexOf('s')  # 2 
    $app.IndexOf('s')| Out-Null # 3 

    # Note: return is not needed. 
    @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo['site'] 

Ecco un esempio di come per avvolgere più istruzioni in uno ScriptBlock per acquisire l'output indesiderati:

function DoSomething { 
    # The Dot-operator '.' executes the ScriptBlock in the current scope. 
    $null = .{ 
     $site = "Something" 
     $app = "else" 

     $app 
    } 

    @{"site" = $($site); "app" = $($app)} 
} 

DoSomething 
+0

@Thanks Rynant: in questo esempio, non esiste un modo migliore per gestire i valori di ritorno. È molto comune impostare variabili, ma dover tornare indietro e bloccare ogni possibile valore di ritorno restituito trasforma alcune funzioni di linea in un brutto pasticcio. Potresti filtrare I.E.> FunctionName | $ _. per ottenere un valore di ritorno? – pghtech

+1

@pghtech - In pratica, non ho trovato che non ci siano molte volte in cui ho bisogno di bloccare esplicitamente un valore di ritorno poiché di solito utilizzo il valore di ritorno o non c'è alcun valore di ritorno. Anche se non so se l'ho visto in pratica, suppongo che potresti avvolgere tutto con '$ null =. {<# Function contents #>}, ma preferisco usare' Out-Null' e simili quando necessario. – Rynant

+0

Seriamente, perché? Ho quasi distrutto il mio portatile cercando di fare alcune funzioni! – Geoffroy

1

@Rynant MOLTO post utile, grazie per aver fornito esempi sull'output della funzione nascosta!

La mia soluzione proposta:

function DoSomething ($a,$b){ 
    @{"site" = $($a); "app" = $($b)} 
} 

$c = DoSomething $Site $App 
Problemi correlati