2012-02-07 23 views
7

Ecco il mio codice:PowerShell comando passaggio argomenti della riga

$script={ 
Write-Host "Num Args:" $args.Length; 
    Write-Host $args[0] 
} 

Invoke-Command -ScriptBlock $script 

Quando eseguo

powershell.exe .\test.ps1 one two three 

ho avuto

Num Args: 0 

ho pensato che avrei avuto

Num Args: 3 
One 

Qualcosa mi manca?

Grazie

risposta

7

In realtà si hanno due scopi lì. Il livello di script e il livello del blocco di script. $args.Length e $args[0] avranno ciò che ti aspetti al livello Invoke-Command. All'interno del blocco di script esiste un altro ambito per $args. Per ottenere gli argomenti dalla riga di comando fino in fondo nel blocco di script, dovrai reinserirli da Invoke-Command -ArgumentList $args.

4

È necessario passare gli argomenti al scriptblock:

Invoke-Command -ScriptBlock $script -ArgumentList $args 
0

È anche possibile dichiarare i parametri con nome in modo esplicito. Per esempio:

param([switch]$someBoolSwitch=$false, [String]$nameOfSomething="some default string")

Questo permette di passare in argomenti con nome allo script, come il seguente esempio:

.\<nameOfScript.ps1> -someBoolSwitch -nameOfSomething "Slayer Roolz!"

e se omesso -nameOfSomething "Slayer Roolz!", quindi $nameOfSomething sarebbe semplicemente default "some default sting". Allo stesso modo, $someBoolSwitch imposta automaticamente $false se non diversamente definito.

Questo metodo ha il vantaggio di consentire allo sviluppatore di decidere quali parametri sono necessari e quali possono essere omessi o predefiniti. Inoltre, consente all'utente di inserire argomenti in qualsiasi ordine a loro piace, dal momento che sono nominati e non posizionali.

Uno svantaggio di avere parametri con nome rispetto ai parametri posizionali è che la chiamata da riga di comando può diventare piuttosto grande poiché l'utente deve digitare ogni nome di parametro.

Problemi correlati