¿Cómo obtener una lista de argumentos?

Resuelto wheleph asked hace 15 años • 13 respuestas

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?

wheleph avatar Dec 11 '08 02:12 wheleph
Aceptado

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.)
%1es el primer parámetro de la línea de comando,
%2es el segundo parámetro de la línea de comando,
y así sucesivamente hasta %9(y SHIFTpuede 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

matt wilkie avatar Dec 19 '2008 21:12 matt wilkie

%*parece contener todos los argumentos pasados ​​al guión.

dancavallaro avatar Dec 10 '2008 19:12 dancavallaro

%1... %ny %*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 ony expandir %1después de una remdeclaració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, param1lo tienes.

Y para utilizarlo param1de forma segura, habilite la expansión retrasada.

Editar: un comentario para %0

%0contiene 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 %0y también %~0contiene el nombre de la función (o mejor la cadena que se usó para llamar a la función).
Pero %~f0aú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
jeb avatar Mar 17 '2011 12:03 jeb

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 %*
KFL avatar Mar 24 '2012 03:03 KFL