2012-02-07 23 views
7

Aquí está mi código:argumentos de línea de comando pase powershell

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

Invoke-Command -ScriptBlock $script 

Cuando corro

powershell.exe .\test.ps1 one two three 

que tiene

Num Args: 0 

pensé que iba a conseguir

Num Args: 3 
One 

Algo me estoy perdiendo?

Gracias

Respuesta

7

que en realidad tienen dos ámbitos allí. El nivel de script y el nivel de bloque de script. $args.Length y $args[0] tendrá lo que espera en el nivel Invoke-Command. Dentro del bloque de script hay otro alcance para $args. Para obtener los argumentos de la línea de comandos hasta el final en el bloque de script, deberá volver a pasarlos desde Invoke-Command -ArgumentList $args.

4

Es necesario pasar los argumentos a la ScriptBlock:

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

También podría declarar explícitamente parámetros con nombre. Por ejemplo:

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

Esto permite pasar de argumentos con nombre a la secuencia de comandos, como el siguiente ejemplo:

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

y si se omitiera -nameOfSomething "Slayer Roolz!", entonces $nameOfSomething sólo tendría por defecto "some default sting". Del mismo modo, $someBoolSwitch se establece de manera predeterminada en $false a menos que se defina lo contrario.

Este método tiene la ventaja de permitirle, como desarrollador, decidir qué parámetros son necesarios y cuáles se pueden omitir o no. Además, le permite al usuario ingresar argumentos en el orden que desee, ya que son nombrados y no posicionales.

Una desventaja de tener parámetros nombrados en lugar de parámetros posicionales es que la invocación de la línea de comandos puede llegar a ser bastante grande ya que el usuario tiene que escribir cada nombre de parámetro.

Cuestiones relacionadas