segundo - script en powershell
Cómo manejar los argumentos de la línea de comandos en PowerShell (1)
¿Cuál es la "mejor" manera de manejar los argumentos de la línea de comandos?
Parece que hay varias respuestas sobre cuál es la mejor manera 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 un plugin que pueda manejar esto 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 UGLY.
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 -
, como script.ps1 -server http://devserver
Luego los manejas en la sección param
al principio del archivo.
También puede asignar valores predeterminados a sus parámetros, 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 del guión 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 parámetro -username
y solicita la entrada del terminal si se omite -username
.
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" donde la secuencia de comandos se ejecuta en un modo más cuidadoso cuando no se usa 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 de la secuencia de comandos, entonces trabajarías así:
if ($force) {
//deletes a file or does something "bad"
}
Ahora, al llamar al script, establecería el parámetro switch / flag de esta manera:
./yourscript.ps1 -server "http://otherserver" -force
Si desea indicar explícitamente que el indicador no está establecido, hay una sintaxis especial para eso
./yourscript.ps1 -server "http://otherserver" -force:$false
Enlaces a la documentación relevante de Microsoft (para PowerShell 5.0; las versiones 3.0 y 4.0 también están disponibles en los enlaces):