En Windows, ¿cómo accede a los argumentos pasados cuando se ejecuta un archivo por lotes?
Por ejemplo, digamos que tengo un programa llamado hello.bat
. Cuando entro hello -a
en una línea de comandos de Windows, ¿cómo hago para que mi programa sepa que -a
se pasó como argumento?
windows
batch-file
cmd
parameters
arguments
Una persona
fuente
fuente
Respuestas:
Como ya han dicho otros, se puede acceder a los parámetros pasados a través de la línea de comandos en archivos por lotes con la notación
%1
a%9
. También hay otros dos tokens que puedes usar:%0
es el nombre del ejecutable (archivo por lotes) como se especifica en la línea de comando .%*
son todos los parámetros especificados en la línea de comando ; esto es muy útil si desea reenviar los parámetros a otro programa.También hay muchas técnicas importantes a tener en cuenta además de simplemente cómo acceder a los parámetros.
Comprobando si se pasó un parámetro
Esto se hace con construcciones como
IF "%~1"==""
, lo cual es cierto si y solo si no se pasó ningún argumento. Tenga en cuenta el carácter tilde que hace que las comillas circundantes se eliminen del valor de%1
; sin tilde obtendrá resultados inesperados si ese valor incluye comillas dobles, incluida la posibilidad de errores de sintaxis.Manejar más de 9 argumentos (o simplemente hacer la vida más fácil)
Si necesita acceder a más de 9 argumentos, debe usar el comando
SHIFT
. Este comando cambia los valores de todos los argumentos en un lugar, de modo que%0
toma el valor de%1
,%1
toma el valor de%2
, etc.%9
toma el valor del décimo argumento (si está presente), que no estaba disponible a través de ninguna variable antes de llamarSHIFT
(enter comandoSHIFT /?
para más opciones).SHIFT
También es útil cuando desea procesar fácilmente los parámetros sin requerir que se presenten en un orden específico. Por ejemplo, un script puede reconocer las banderas-a
y-b
en cualquier orden. Una buena manera de analizar la línea de comando en tales casos esEste esquema le permite analizar líneas de comando bastante complejas sin volverse loco.
Sustitución de parámetros por lotes
Para los parámetros que representan nombres de archivo, el shell proporciona muchas funciones relacionadas con el trabajo con archivos a los que no se puede acceder de ninguna otra manera. Se accede a esta funcionalidad con construcciones que comienzan con
%~
.Por ejemplo, para obtener el tamaño del archivo pasado como argumento, use
Para obtener la ruta del directorio desde el que se inició el archivo por lotes (¡muy útil!) Puede usar
Puede ver el rango completo de estas capacidades escribiendo
CALL /?
en el símbolo del sistema.fuente
"name=John"
haráname John
durante exe. Una solución alternativa es rodear con comillas simples,'"name=John"'
CALL /?
? Aquí he estado dando vueltas con Google todo el tiempo.Uso de parámetros en archivos por lotes:% 0 y% 9
Los archivos por lotes pueden referirse a las palabras pasadas como parámetros con los tokens:
%0
to%9
.Los parámetros pasados en la línea de comandos deben ser caracteres alfanuméricos y delimitados por espacios. Dado que
%0
es el nombre del programa como se llamó, en DOS%0
estará vacío para AUTOEXEC.BAT si se inicia en el momento del arranque.Ejemplo:
Ponga el siguiente comando en un archivo por lotes llamado
mybatch.bat
:Invocar el archivo por lotes de esta manera:
mybatch john billy
generaría:Obtenga más de 9 parámetros para un archivo por lotes, use:% *
La ficha de porcentaje de estrella
%*
significa "el resto de los parámetros". Puede usar un bucle for para capturarlos, como se define aquí:http://www.robvanderwoude.com/parameters.php
Notas sobre delimitadores para parámetros de lote
Los archivos por lotes ignoran algunos caracteres en los parámetros de la línea de comandos, dependiendo de la versión de DOS, si están "escapados" o no, y a menudo según su ubicación en la línea de comandos:
fuente
Los archivos por lotes pasan automáticamente el texto después del programa siempre que sean variables a las que asignarlos. Se pasan en orden para ser enviados; Por ejemplo,% 1 será la primera cadena enviada después de llamar al programa, etc.
Si tienes Hello.bat y los contenidos son:
e invocas el lote al mando a través de
deberías recibir este mensaje:
Hola, APerson241, gracias por ejecutar este archivo por lotes (11/01/2013)
fuente
@ Jon's
:parse
/:endparse
esquema es un gran comienzo, y tiene mi gratitud por la aprobación inicial, pero si crees que el tortuoso sistema por lotes de Windows te dejaría así de fácil ... bueno, amigo mío, te sorprenderás. He pasado todo el día con este demonio, y después de mucha investigación y experimentación dolorosa finalmente logré algo viable para una utilidad de la vida real.Digamos que queremos implementar una utilidad
foobar
. Requiere un comando inicial. Tiene un parámetro opcional--foo
que toma un valor opcional (que no puede ser otro parámetro, por supuesto); si falta el valor, su valor predeterminado esdefault
. También tiene un parámetro opcional--bar
que toma un valor requerido . Por último, puede tomar una bandera--baz
sin valor permitido. Ah, y estos parámetros pueden venir en cualquier orden.En otras palabras, se ve así:
¿Complicado? No, eso parece bastante típico de las utilidades de la vida real. (
git
alguien?)Sin más preámbulos, aquí hay una solución:
Sí, realmente es tan malo. Vea mi publicación similar en https://stackoverflow.com/a/50653047/421049 , donde proporciono más análisis de lo que está sucediendo en la lógica y por qué usé ciertas construcciones.
Horrible. La mayor parte de eso tuve que aprender hoy. Y duele.
fuente
Utilice variables, es decir, las
.BAT
variables y llame%0
a%9
fuente