Cómo manejar argumentos de línea de comandos en PowerShell
¿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
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 param
secció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, $server
obtiene un valor predeterminado si se llama al script sin él, el script se detiene si omite el -username
parámetro y solicita la entrada del terminal si -password
se 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