2010-01-28 32 views
323

¿Cuál es la "mejor" forma de manejar argumentos de línea de comandos?Cómo manejar argumentos de línea de comandos en PowerShell

Parece que hay varias respuestas sobre lo que es la "mejor" es y como resultado estoy atascado en cómo manejar algo tan simple como:

script.ps1 /n name /d domain 

Y

script.ps1 /d domain /n name. 

¿Hay algún complemento que pueda manejarlo mejor? Sé que estoy reinventando la rueda aquí.

Obviamente, lo que ya tengo no es bonito y seguramente no es el "mejor", pero funciona ... y es feo.

for ($i = 0; $i -lt $args.count; $i++) { 
    if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]} 
    if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]} 
    if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]} 
    if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]} 
} 
Write-Host $strName 
Write-Host $strDomain 

Respuesta

604

Estás reinventando la rueda. scripts de PowerShell normales tienen parámetros a partir de -, como script.ps1 -server http://devserver

A continuación, las manejan en param sección en el principio del archivo (ver tutorial: https://devcentral.f5.com/articles/powershell-abcs-p-is-for-parameters)

También puede asignar valores por defecto a sus parametros, leerlos desde la consola si no está disponible o detener la ejecución del script:

param (
    [string]$server = "http://defaultserver", 
    [Parameter(Mandatory=$true)][string]$username, 
    [string]$password = $(Read-Host "Input password, please") 
) 

Dentro de la secuencia de comandos que puede simplemente

write-output $server 

ya que todos los parámetros se convierten en variables disponibles en el alcance del script.

En este ejemplo, el $server obtiene un valor por defecto si el script se llama sin ella, la escritura se detiene si se omite el parámetro -username y pide la entrada del terminal si se omite -password.

Actualización: Es posible que desee pasar un "indicador" (un parámetro booleano verdadero/falso) a un script de PowerShell. Por ejemplo, su secuencia de comandos puede aceptar una "fuerza" donde la secuencia de comandos se ejecuta en un modo más cuidadoso cuando no se utiliza la fuerza.

La palabra clave para ese tipo es [switch] parámetro:

param (
    [string]$server = "http://defaultserver", 
    [string]$password = $(Read-Host "Input password, please"), 
    [switch]$force = $false 
) 

Dentro de la secuencia de comandos, entonces sería trabajar con él de esta manera:

if ($force) { 
    //deletes a file or does something "bad" 
} 

Ahora, cuando se llama a la secuencia de comandos lo haces con la parámetro de interruptor/bandera como este:

.\yourscript.ps1 -server "http://otherserver" -force 

Si explícitamente desea st comió que la bandera no está definida, hay una sintaxis especial para que

.\yourscript.ps1 -server "http://otherserver" -force:$false 

Los enlaces a la documentación pertinente Microsoft (por PowerShell 5.0; las versiones 3.0 y 4.0 también están disponibles en los enlaces):

+5

increíble! Y gracioso porque originalmente estaba tratando de usar param pero me alejé de él porque no pude descifrar la sintaxis. ¡Jaja gracias! –

+33

De hecho, una de las grandes ventajas de PowerShell es que proporciona una infraestructura de análisis de parámetro estándar que es fácil de usar. –

+0

Tiene "-site" en el ejemplo de la línea de comandos y no coincide con "[string] $ server" en el script ¿Eso es un error tipográfico? – JasDev

Cuestiones relacionadas