Pasar argumentos de línea de comandos a un script por lotes de Windows

10

Necesito crear un script por lotes de Windows donde necesito pasar algunos argumentos de línea de comandos. Estos argumentos pueden aparecer en cualquier orden, pero la secuencia de comandos debe recogerlos correctamente en función del nombre del argumento. P.ej:

<scriptname> -age <agevalue> -gender <gender>
<scriptname> -gender <gender> -age <agevalue>

La secuencia de comandos se puede invocar en cualquiera de las dos formas anteriores, pero la edad y el género se deben seleccionar y asignar correctamente a las variables. Los argumentos pueden ser identificados por el interruptor antes de ellos, es decir, -age, -gender, etc.

¿Puede alguien darme un ejemplo para identificar esto internamente?

Dhiwakar Ravikumar
fuente

Respuestas:

10

Lote, desafortunadamente, no tiene una getopsfunción integrada como . Sin embargo, podría implementar su propia variante de pobre:

:GETOPTS
 if /I %~1 == --age set AGE=%2& shift
 if /I %~1 == --gender set GENDER=%2& shift
 shift
if not (%1)==() goto GETOPTS
Mureinik
fuente
Esto puede ser engorroso ya que el número de argumentos excede, pero se ajusta a la factura. Gracias
Dhiwakar Ravikumar
1
Siguiendo a robvanderwoude.com/if.php , sería mejor escribir if /I "%~1" == "--age" ... (tenga en cuenta la tilde). Esto también funciona para parámetros vacíos o parámetros que se ponen entre comillas dobles.
Axel Kemper
Es posible que desee agregar las comillas dobles. De lo contrario, la instrucción no funciona con el parámetro vacío% 1.
Axel Kemper
Si sus diversos argumentos posibles tienen un formato o tipo establecido, como edad (ser numérico) y género (ser "M" o "F"), no debería tener que definir los argumentos, sino utilizar el reconocimiento de comparación para asignarlos a Las variables apropiadas dentro del script. Hice esto para un script por lotes temprano que escribí durante un período de transición entre 9x y XP en mi primer trabajo de TI. El script podría aceptar argumentos para el tipo de sistema operativo, la unidad desde la que se ejecutaba el script y algunas otras cosas, o podría detectar automáticamente la configuración adecuada. Un poco exagerado, pero un ejercicio divertido.
music2myear
8

¿Puedes hacerlo con Powershell? o necesita ser por lotes? Powershell lo hace agradable y fácil, solo necesita agregar algo como esto en la parte superior de su script, y luego puede llamar a cada parámetro en cualquier orden

param (
[string]$Age,
[string]$Gender
)

Puede hacerlo con lotes, pero requerirá una gran cantidad de verificación de parámetros. Aquí hay algunos enlaces de algunos scripts de lotes que lo hacen

http://www.ericphelps.com/batch/samples/arguments.bat.txt

(Posible duplicado de)

/programming/5215729/is-there-a-way-to-pass-parameters-by-name-and-not-by-order-to-a-batch-bat-f

mrwhale
fuente
1
tiene que ser solo scripts por lotes :(. Tenemos un requisito estricto de que sea un script por lotes. Muchas gracias :)
Dhiwakar Ravikumar