Necesito que mi archivo bat acepte múltiples argumentos con nombre opcionales.
mycmd.bat man1 man2 -username alice -otheroption
Por ejemplo, mi comando tiene 2 parámetros obligatorios y dos parámetros opcionales (-username) que tiene un valor de argumento de alice y -otheroption:
Me gustaría poder introducir estos valores en variables.
Solo llamo a cualquiera que ya haya resuelto esto. Hombre, estas limas de murciélago son un fastidio.
batch-file
galleta de pollo
fuente
fuente
http://web.archive.org/web/20090403050231/http://www.pcguide.com/vb/showthread.php?t=52323
.Respuestas:
Aunque tiendo a estar de acuerdo con el comentario de @AlekDavis , hay varias formas de hacer esto en el shell de NT.
El enfoque que aprovecharía el comando SHIFT y la ramificación condicional IF , algo como esto ...
fuente
SHIFT /2
turnos comenzando en arg 2. No cambia dos veces. ¿No debería ser reemplazado porSHIFT & SHIFT
?mycmd.bat -username anyvalue -username myName -otheroption othervalue
. El resultado debe ser user = myName, other = othervalue; pero el código da user = -username, other = othervalue. El error se corrige reemplazandoSHIFT /2
conSHIFT & SHIFT
.;
- no se puede usar en lugar de&
.%1
y%2
han sido "Usados". b) El sencilloSHIFT
en la línea 11 mueve el valor de%2
1 posición hacia abajo y luego está disponible (nuevamente) como%1
, y el valor "No utilizado" de%3
está disponible como%2
. c) ElIF
en la línea 13 ve este valor ya "Usado" del%2
que ahora está en%1
. d) Si el "nombre de usuario" de la línea 10 se ve así"-otheroption"
, se usará nuevamente yother
se establecerá con el nuevo valor en%2
, que probablemente era el nombre de la siguiente opción. --->-otheroption
no fue seguido por un valor, por lo que probablemente se pensó como una-Flag
opción de tipo y no debería consumir un segundo argumento. 3º: Si el argumento%1
no es manejado por lasIF
declaraciones internas , se ignora silenciosamente. El código probablemente debería mostrar un mensaje que indique que no es una opción válida. Esto se puede hacer agregando las declaraciones requeridasSHIFT
yGOTO :loop
en lasIF
declaraciones internas , o agregando unaELSE
declaración.La respuesta seleccionada funciona, pero podría mejorarse un poco.
Mi solución se basa en la creación de una variable OPTIONS que define todas las opciones y sus valores predeterminados. OPTIONS también se utiliza para probar si una opción proporcionada es válida. Se guarda una enorme cantidad de código simplemente almacenando los valores de las opciones en variables con el mismo nombre que la opción. La cantidad de código es constante independientemente de cuántas opciones se definan; solo tiene que cambiar la definición de OPCIONES.
EDITAR - Además, el código de bucle: debe cambiar si cambia el número de argumentos posicionales obligatorios. Por ejemplo, muchas veces se nombran todos los argumentos, en cuyo caso desea analizar los argumentos que comienzan en la posición 1 en lugar de 3. Por lo tanto, dentro del ciclo:, los 3 se convierten en 1 y el 4 en 2.
Realmente no hay tanto código. La mayor parte del código anterior son comentarios. Aquí está exactamente el mismo código, sin los comentarios.
Esta solución proporciona argumentos de estilo Unix dentro de un lote de Windows. Esta no es la norma para Windows: por lo general, el lote tiene las opciones que preceden a los argumentos requeridos y las opciones tienen el prefijo
/
.Las técnicas utilizadas en esta solución se adaptan fácilmente al estilo de opciones de Windows.
%1
, y continúa hasta que arg 1 no comienza con/
/
.SET /VAR=VALUE
fallaSET "/VAR=VALUE"
funciona. De todos modos, ya estoy haciendo esto en mi solución./
. Esta limitación se puede eliminar empleando una//
opción definida implícitamente que sirve como señal para salir del ciclo de análisis de opciones. No se almacenará nada para la//
"opción".Actualización 2015-12-28: Soporte para
!
valores de opción inEn el código anterior, cada argumento se expande mientras la expansión retardada está habilitada, lo que significa que
!
lo más probable es que se eliminen, o que!var!
se expanda algo similar . Además,^
también se puede quitar si!
está presente. La siguiente pequeña modificación al código sin comentarios elimina la limitación de modo que!
y^
se conservan en los valores de las opciones.fuente
Si desea utilizar argumentos opcionales, pero no argumentos con nombre, entonces este enfoque funcionó para mí. Creo que este es un código mucho más fácil de seguir.
fuente
IF "%1"==""
fallará si el argumento contiene comillas. Simplemente use cualquier otro símbolo no especial en su lugar, como ._ = [] #, etc.Creación de variables dinámicas
Pros
%1
,%2
...%*
intacto/arg
y-arg
estiloContras
setlocal
para el alcance local o escriba una:CLEAR-ARGS
rutina adjunta .--force
a-f
)""
soporte de argumento vacíoUso
A continuación, se muestra un ejemplo de cómo se relacionan los siguientes argumentos con las variables .bat:
Implementación
fuente
:ARG-PARSER
rutina a un archivo .bat externoarg-parser.bat
para que también esté disponible para otros scripts.Una vez que había escrito un programa que maneja los argumentos cortos (-h), largos (--help) y sin opción en un archivo por lotes. Esta técnica incluye:
argumentos que no son opciones seguidos de argumentos de opción.
operador shift para aquellas opciones que no tienen argumentos como '--help'.
operador de dos turnos de tiempo para aquellas opciones que requieren un argumento.
recorrer una etiqueta para procesar todos los argumentos de la línea de comandos.
Salga de la secuencia de comandos y detenga el procesamiento de aquellas opciones que no requieran acciones adicionales como '--help'.
Funciones de ayuda escritas para la orientación del usuario
Aquí está mi código.
fuente
Aquí está el analizador de argumentos. Puede mezclar cualquier argumento de cadena (que se mantenga intacto) o opciones de escape (pares únicos o de opción / valor). Para probarlo, descomente las últimas 2 declaraciones y ejecútelo como:
El carácter de escape se define como
"_SEP_=/"
, redefinir si es necesario.fuente