sintaxis segundo script principales plano instrucciones ejecutar comandos basicos powershell command-line-arguments

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):