2012-02-07 14 views
7

Oto mój kod:PowerShell argumenty linii poleceń wprost

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

Invoke-Command -ScriptBlock $script 

Kiedy biegnę

powershell.exe .\test.ps1 one two three 

mam

Num Args: 0 

myślałem, że chciałbym dostać

Num Args: 3 
One 

Coś mi brakuje?

Dzięki

Odpowiedz

7

Trzeba rzeczywiście dwa zakresy tam. Poziom skryptu i poziom bloku skryptu. $args.Length i $args[0] będą miały to, czego oczekujesz na poziomie Invoke-Command. Wewnątrz bloku skryptu jest inny zakres dla $args. Aby uzyskać argumenty od wiersza poleceń aż do bloku skryptu, musisz je ponownie przekazać od Invoke-Command -ArgumentList $args.

4

Trzeba przekazać argumenty do scriptblock:

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

Można również jawnie zadeklarować nazwane parametry. Na przykład:

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

To pozwala przechodzić w wymienionych argumentów do skryptu, jak w poniższym przykładzie:

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

a jeśli pominąć -nameOfSomething "Slayer Roolz!", następnie $nameOfSomething po prostu domyślnie "some default sting". Podobnie, domyślnie $someBoolSwitch do $false, chyba że określono inaczej.

Ta metoda pozwala użytkownikowi, jako programistce, decydować, które parametry są konieczne, a które można pominąć lub zmienić. Ponadto pozwala użytkownikowi na wprowadzanie argumentów w dowolnej kolejności, ponieważ są one nazwane, a nie pozycyjne.

Jedną wadą posiadania parametrów nazwanych w przeciwieństwie do parametrów pozycyjnych jest to, że wywołanie linii poleceń może stać się dość duże, ponieważ użytkownik musi wpisać nazwę każdego parametru.

Powiązane problemy