¿Cómo obtener una lista de argumentos?
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 comando (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 la línea de comando,
%2
es el segundo parámetro de la línea de comando,
y así sucesivamente hasta %9
(y SHIFT
puede usarse para aquellos 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 -lote.bat)
Más ejemplos de información en https://www.ss64.com/nt/syntax-args.html y https://www.robvanderwoude.com/parameters.html
%*
parece contener todos los argumentos pasados al guión.
%1
... %n
y %*
contiene los argumentos, pero puede resultar complicado acceder a ellos, porque el contenido será interpretado.
Por lo tanto, es imposible manejar algo como esto con declaraciones normales.
myBatch.bat "&"^&
Cada línea falla, ya que cmd.exe intenta ejecutar uno de los símbolos (el contenido de %1 es "&"&
)
set var=%1
set "var=%1"
set var=%~1
set "var=%~1"
Pero existe una solución con un archivo temporal.
@echo off
SETLOCAL DisableDelayedExpansion
SETLOCAL
for %%a in (1) do (
set "prompt=$_"
echo on
for %%b in (1) do rem * #%1#
@echo off
) > param.txt
ENDLOCAL
for /F "delims=" %%L in (param.txt) do (
set "param1=%%L"
)
SETLOCAL EnableDelayedExpansion
set "param1=!param1:*#=!"
set "param1=!param1:~0,-2!"
echo %%1 is '!param1!'
El truco consiste en habilitar echo on
y expandir %1
después de una rem
declaración (también funciona con %2 .. %*).
Pero para poder redirigir la salida de echo on
, necesitas los dos FOR-LOOPS.
Los caracteres adicionales * #
se utilizan para protegerse de contenidos como /?
(mostraría la ayuda para REM).
O un signo de intercalación ^ al final de la línea podría funcionar como un carácter de varias líneas.
El FOR /F debería funcionar con la expansión retrasada desactivada; de lo contrario, el contenido será "!" sería destruido.
Después de eliminar los caracteres adicionales, param1
lo tienes.
Y para utilizarlo param1
de forma segura, habilite la expansión retrasada.
Editar: un comentario para %0
%0
contiene el comando utilizado para llamar al lote, conservando también el caso como en FoO.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 usó para llamar a la función).
Pero %~f0
aún puedes recordar el nombre del archivo.
@echo off
echo main %0, %~0, %~f0
call :myLabel+xyz
exit /b
:MYlabel
echo func %0, %~0, %~f0
exit /b
Producción
main test.bat, test.bat, C:\temp\test.bat
func :myLabel+xyz, :myLabel+xyz, C:\temp\test.bat
Lo encontré la próxima vez que necesites buscar esta información. En lugar de abrir un navegador y buscarlo en Google, simplemente escribe call /?
tu cmd y lo obtendrás:
...
%* in a batch script refers to all the arguments (e.g. %1 %2 %3
%4 %5 ...)
Substitution of batch parameters (%n) has been enhanced. You can
now use the following optional syntax:
%~1 - expands %1 removing any surrounding quotes (")
%~f1 - expands %1 to a fully qualified path name
%~d1 - expands %1 to a drive letter only
%~p1 - expands %1 to a path only
%~n1 - expands %1 to a file name only
%~x1 - expands %1 to a file extension only
%~s1 - expanded path contains short names only
%~a1 - expands %1 to file attributes
%~t1 - expands %1 to date/time of file
%~z1 - expands %1 to size of file
%~$PATH:1 - searches the directories listed in the PATH
environment variable and expands %1 to the fully
qualified name of the first one found. If the
environment variable name is not defined or the
file is not found by the search, then this
modifier expands to the empty string
The modifiers can be combined to get compound results:
%~dp1 - expands %1 to a drive letter and path only
%~nx1 - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
environment variable for %1 and expands to the
drive letter and path of the first one found.
%~ftza1 - expands %1 to a DIR like output line
In the above examples %1 and PATH can be replaced by other
valid values. The %~ syntax is terminated by a valid argument
number. The %~ modifiers may not be used with %*