Cómo manejar argumentos de línea de comandos en PowerShell

Resuelto Aaron Wurthmann asked hace 14 años • 1 respuestas

¿Cuál es la "mejor" forma de manejar los argumentos de la línea de comandos?

Parece que hay varias respuestas sobre cuál es la "mejor" forma y, como resultado, no sé cómo manejar algo tan simple como:

script.ps1 /n name /d domain

Y

script.ps1 /d domain /n name.

¿Existe algún complemento que pueda manejar esto mejor? Sé que estoy reinventando la rueda aquí.

Obviamente lo que tengo ya 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
Aaron Wurthmann avatar Jan 29 '10 03:01 Aaron Wurthmann
Aceptado

Estás reinventando la rueda. Los scripts normales de PowerShell tienen parámetros que comienzan con -, comoscript.ps1 -server http://devserver

Luego los maneja en una paramsección (tenga en cuenta que esto debe comenzar en la primera línea no comentada de su script).

También puedes asignar valores predeterminados a tus parámetros, leerlos desde la consola si no están disponibles 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 del script puedes simplemente

write-output $server

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

En este ejemplo, $serverobtiene un valor predeterminado si se llama al script sin él, el script se detiene si omite el -usernameparámetro y solicita la entrada del terminal si -passwordse omite.

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

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

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

Dentro del script entonces trabajarías con él de esta manera:

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

Ahora, al llamar al script, debes configurar el parámetro switch/flag de esta manera:

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

Si desea indicar explícitamente que la bandera no está configurada, existe una sintaxis especial para eso.

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

Enlaces a documentación relevante de Microsoft (para PowerShell 5.0; aunque las versiones 3.0 y 4.0 también están disponibles en los enlaces):

  • acerca de_Scripts
  • acerca de_Funciones
  • about_Functions_Advanced_Parameters
naivists avatar Jan 28 '2010 20:01 naivists