Me gustaría encontrar una contraparte por lotes de Windows para Bash $@
que contenga una lista de todos los argumentos pasados a un script.
¿O tengo que molestarme shift
?
fuente
Me gustaría encontrar una contraparte por lotes de Windows para Bash $@
que contenga una lista de todos los argumentos pasados a un script.
¿O tengo que molestarme shift
?
dancavallaro tiene razón, %*
para todos los parámetros de la línea de comandos (excluyendo el nombre del script). También puede encontrar estos útiles:
%0
- el comando utilizado para llamar al archivo por lotes (podría ser foo
, ..\foo
, c:\bats\foo.bat
, etc.)
%1
es el primer parámetro de línea de comandos,
%2
es el segundo parámetro de línea de comandos,
y así sucesivamente hasta %9
(y SHIFT
se puede utilizar para aquellos que después del 9).
%~nx0
- el nombre real del archivo por lotes, independientemente del método de llamada (some-batch.bat)
%~dp0
- unidad y ruta al script (d: \ scripts)
%~dpnx0
- es el nombre de ruta completo del script (d: \ scripts \ some -batch.bat)
Más ejemplos de información en https://www.ss64.com/nt/syntax-args.html y https://www.robvanderwoude.com/parameters.html
%~dpn0
devolverá la unidad y la ruta al script más el nombre del archivo por lotes, pero no la extensión. Encontré esto particularmente útil al crear scripts por lotes que llaman a un.ps1
archivo con el mismo nombre. Esencialmente, sed
refiere a la unidad, sep
refiere a la ruta, sen
refiere al nombre del archivo y sex
refiere a la extensión. Con esa información, puedes hacer bastante.@echo %~n0.my_ext
%*
parece contener todos los argumentos pasados al script.fuente
&
? Cuando intento recuperar varios la ruta de varios archivos seleccionados (usando el menú Enviar a y "% *" que pasa los argumentos a un .py) detiene la lista en los caracteres &. Entonces, si, por ejemplo, el segundo archivo contiene un&
en su nombre,&
se omitirá la parte del nombre después del y los archivos restantes.)&
es un personaje especial que significastop this command and start another one
. Se&
debe citar un nombre de archivo que contenga un .%1
...%n
y%*
contiene los argumentos, pero puede ser complicado acceder a ellos, porque el contenido será interpretado.Por lo tanto, es imposible manejar algo como esto con declaraciones normales
Cada línea falla, ya que cmd.exe intenta ejecutar uno de los símbolos (el contenido de% 1 es
"&"&
)Pero existe una solución alternativa con un archivo temporal
El truco es habilitar
echo on
y expandir%1
después de unarem
declaración (también funciona con% 2 ..% *).Pero para poder redirigir la salida de
echo on
, necesita los dos FOR-LOOPS.Los caracteres adicionales
* #
se usan para estar seguros contra contenidos como/?
(mostraría la ayuda para REM).O un símbolo de intercalación al final de la línea podría funcionar como un carácter multilínea.
El FOR / F debe funcionar con la expansión retrasada desactivada, de lo contrario el contenido con "!" Sería destruido.
Después de eliminar los caracteres adicionales
param1
y lo tienes.Y para usar
param1
de manera segura, habilite la expansión demorada.Editar: un comentario para% 0
%0
contiene el comando utilizado para llamar al lote, también conserva el caso como enFoO.BaT
Pero después de una llamada a una función
%0
y también%~0
contiene el nombre de la función (o mejor, la cadena que se utilizó para llamar a la función).Pero
%~f0
contigo aún puedes recordar el nombre del archivo.Salida
fuente
%~f0
truco es totalmente inesperado, genial y potencialmente muy útil :-) No es sorprendente que los otros modificadores funcionen de la misma manera, siempre operando en el archivo por lotes principal, incluso cuando están en una subrutina llamada. Esto parece digno de sus propias preguntas y respuestas: "¿Cómo acceder al nombre del lote en ejecución en una subrutina llamada?"Encontré eso la próxima vez que necesite buscar esta información. En lugar de abrir un navegador y buscarlo en Google, puede escribir
call /?
su cmd y lo obtendrá:fuente
La forma de recuperar todos los argumentos de un script está aquí:
fuente
%%I
interpretate y puede romper tu script.Aquí hay una manera bastante simple de obtener los argumentos y configurarlos como envoltorios. En este ejemplo, me referiré a ellos como claves y valores.
Guarde el siguiente ejemplo de código como "args.bat". Luego llame al archivo por lotes que guardó desde una línea de comando. ejemplo: arg.bat --x 90 --y 120
He proporcionado algunos comandos de eco para guiarlo a través del proceso. Pero el resultado final es que --x tendrá un valor de 90 y --y tendrá un valor de 120 (es decir, si ejecuta el ejemplo como se especificó anteriormente ;-)).
A continuación, puede usar la instrucción condicional 'si está definida' para determinar si ejecutar o no su bloque de código. Entonces, digamos ejecutar: "arg.bat --x hello-world" Entonces podría usar la declaración "IF DEFINED --x echo% - x%" y los resultados serían "hello-world". Debería tener más sentido si ejecuta el lote.
fuente
Obs: Para usar sin:
?*&<>
fuente
El siguiente código simula una matriz ('
params
'): toma los parámetros recibidos por el script y los almacena en las variablesparams_1
..params_n
, donden
=params_0
= el número de elementos de la matriz:fuente
Si tiene parámetros entre comillas que contienen espacios,
%*
no funcionará correctamente. La mejor solución que encontré es tener un bucle que une todos los argumentos: https://serverfault.com/a/22541fuente
Puede usar
For
Commad, para obtener la lista de Arg.Ayuda:
For /?
Ayuda:Setlocal /?
Aquí está mi camino =
No necesita el comando Shift.
fuente
fuente
Mucha de la información anterior me llevó a una mayor investigación y, en última instancia, a mi respuesta, por lo que quería contribuir con lo que terminé haciendo con la esperanza de que ayude a alguien más:
También quería pasar un número variado de variables a un archivo por lotes para que pudieran procesarse dentro del archivo.
Estaba de acuerdo con pasarlos al archivo por lotes usando comillas
Me gustaría que se procesen de forma similar a la siguiente, pero usando un bucle en lugar de escribirlo manualmente:
Entonces quería ejecutar esto:
Y a través de la magia de for loops, haz esto dentro del archivo por lotes:
El problema que tenía es que todos mis intentos de usar un bucle for no funcionaban. El siguiente ejemplo:
solo haría:
y no:
incluso después de configurar
La razón fue que el ciclo for leyó toda la línea y asignó mi segundo parámetro a %% B durante la primera iteración del ciclo. Debido a que% * representa todos los argumentos, solo hay una sola línea para procesar; por lo tanto, solo ocurre una pasada del ciclo for. Esto es así por diseño, y mi lógica estaba equivocada.
Así que dejé de intentar usar un bucle for y simplifiqué lo que estaba tratando de hacer usando if, shift y una instrucción goto. Estuve de acuerdo en que es un poco hack pero es más adecuado para mis necesidades. Puedo recorrer todos los argumentos y luego usar una instrucción if para abandonar el ciclo una vez que los procese todos.
La declaración ganadora de lo que estaba tratando de lograr:
ACTUALIZACIÓN: en su lugar, tuve que modificar lo siguiente, estaba exponiendo todas las variables de entorno al intentar hacer referencia a% 1 y usar shift de esta manera:
fuente
A veces necesito extraer varios parámetros de la línea de comandos, pero no todos y no del primero. Asumamos la siguiente llamada:
Por supuesto, la extensión ".bat" no es necesaria, al menos tiene test.exe en la misma carpeta. Lo que queremos es obtener la salida "tres cuatro cinco" (no importa si una línea o tres). El objetivo es que solo necesito tres parámetros y comenzar en el tercero. Para tener un ejemplo simple, la acción para cada uno es simplemente "eco", pero puede pensar en alguna otra acción más compleja sobre los parámetros seleccionados.
He producido algunos ejemplos (opciones) para que pueda ver cuál considera mejor para usted. Desafortunadamente, no hay una buena manera (o no sé) basada en un bucle for en el rango como "for %% i in (% 3, 1,% 5)".
Probablemente pueda encontrar más opciones o combinar varias. Disfrútenlos
fuente
Versión de Windows (aunque necesita socat)
configurarlo:
fuente