¿Los archivos por lotes de Windows tienen una construcción% *?

10

En un archivo por lotes, ¿tengo que hacer (por ejemplo) lo siguiente?

@echo off
call other.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
Roger Lipscombe
fuente
Similar a $ @ en Unix
An̲̳̳drew

Respuestas:

10

Los archivos por lotes de Windows (desde Windows XP, pero posiblemente antes) admiten la %*construcción, que evalúa todos los parámetros desde% 1 en adelante.

Desafortunadamente, esto no respeta el SHIFTcomando, por lo que lo siguiente no funcionará:

@echo off
set EATEN=%1
shift

call other.bat %*

Todavía pasará el primer parámetro al segundo archivo por lotes.

Roger Lipscombe
fuente
2
Nota: %*conserva espacios en blanco / comillas.
Aaron Digulla
10

Puedes juntar todos los argumentos usando algo como:

set args=%1
shift
:start
if [%1] == [] goto done
set args=%args% %1
shift
goto start

:done
(use %args% here)

Esto funciona independientemente de cuántos argumentos haya.

Graeme Perrow
fuente
1

Ellos si.

Puede escribir su ejemplo de la siguiente manera:

@echo off
call other.bat %*

Además: shift es compatible con Windows ... Mira esto .
Pero, de hecho, ese último enlace confirma que shift no funciona en combinación con% *:

• Usar% * con shift
  Shift no tiene efecto en el parámetro por lotes% *.

fretje
fuente
Lo sentimos, los enlaces eran malos ... deberían arreglarse ahora.
fretje
(presupuesto) El uso de% * con shift Shift no tiene ningún efecto en el parámetro por lotes% *. (/ quote)
Wedge
¿Por qué el voto negativo? La pregunta era sobre% * no sobre el cambio.
fretje
Su primera respuesta solo tenía "Sí, lo hacen", que no era un vínculo obvio (o respuesta). Su última edición es mucho más de una respuesta decente, tal vez por eso ...
Thijs
En realidad, el voto negativo ocurrió después de que agregué más explicaciones. Y estoy de acuerdo que el enlace en "Sí lo hacen" no era evidente, pero era una respuesta exacta a la cuestión que nos ocupa ...
fretje
0
@echo off
cls
setlocal enabledelayedexpansion

:: Disable the display of information by changing [set "_ENABLE_INFO="] to [set "_ENABLE_INFO=::"].
set "_ENABLE_INFO="
set _DBQ="

set "_PARMS.ORIGINAL=%*" && if defined _PARMS.ORIGINAL (
   if not defined _PARMS.IDX (
      echo Parameter Index^(es^) to extract eg.:
      echo 1 2 5 9 11 39 400
      set /p "_PARMS.IDX=>"
   )
   set "_PARMS.IDX=¡!_PARMS.IDX: =¡ ¡!¡"
   set "_PARMS.IDX=!_PARMS.IDX:¡¡=!"
   set "_PARMS.IDX=!_PARMS.IDX: =!"
   call :_FN_PROC.STRING %*
%_ENABLE_INFO% goto :FINISH
   goto :eof
) else (
   echo No input parameters.
)
goto :eof


:_FN_PROC.STRING
set "_PARMS.PROCESS.STRING=%*"
:_FN_PROC.STRING.LOOP
set "_PARMS.PROCESS.STRING=!_PARMS.PROCESS.STRING:%_DBQ%=¡!"
set /a _PARMS.COUNT+=1
for /f "tokens=1* delims= " %%a in ("!_PARMS.PROCESS.STRING!") do (
   set _PARMS.TMP.CHECK=%%a
   set _PARMS.PROCESS.STRING=%%b
   if "!_PARMS.TMP.CHECK!" NEQ "!_PARMS.TMP.CHECK:¡=!" (
      for /f "tokens=1* delims=¡" %%c in ("%%a !_PARMS.PROCESS.STRING!") do (
         set _PARMS.TMP.CHECK="%%c"
         set _PARMS.PROCESS.STRING=%%d
      )
   )
)

if "!_PARMS.IDX:¡%_PARMS.COUNT%¡=!" EQU "!_PARMS.IDX!" (
   set _PARMS.REMAINING=!_PARMS.REMAINING! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX!{%_PARMS.COUNT%}
) else (
   set _PARMS.EXTRACTED=!_PARMS.EXTRACTED! !_PARMS.TMP.CHECK!
   set _PARMS.IDX=!_PARMS.IDX:¡%_PARMS.COUNT%¡=!
   set _PARMS.IDX=!_PARMS.IDX![%_PARMS.COUNT%]
)

if "!_PARMS.PROCESS.STRING: =!"=="" (set _PARMS.PROCESS.STRING=)
if defined _PARMS.PROCESS.STRING (goto :_FN_PROC.STRING.LOOP)

set _DBQ=
set _PARMS.TMP.CHECK=
if defined _PARMS.REMAINING (set _PARMS.REMAINING=!_PARMS.REMAINING:~1!)
if defined _PARMS.EXTRACTED (set _PARMS.EXTRACTED=!_PARMS.EXTRACTED:~1!)
goto :eof


:FINISH
echo.
echo _PARMS.IDX ^:
echo    ¡^=¡ no Parameter Index was specified for extraction.
echo    ¡n¡ nth Parameter was not processed (Index larger than Parameters Count).
echo    [n] nth Parameter was Extracted.
echo    {n} nth Parameter was Ignored (Remaining).
echo.
set _
goto :eof
Dharma Leonardi
fuente
Conserva todos los delimitadores especiales. Admite tantos parámetros como se pueden ajustar en un límite de 8175 caracteres por línea de comando (incluido el nombre de archivo del lote, CRLF y la ruta del lote si se especifica). Los parámetros se pueden agrupar con comillas dobles (por ejemplo, "sw1 = / quiet / skip: 1 / start = 3"). Nota: las comillas dobles se conservan. Se espera el comportamiento de comillas dobles (incluso si se usa incorrectamente, por ejemplo, si se usa solo o "" o ""). Primero depure el código antes de hacer un informe de error.
Dharma Leonardi
Esa es una respuesta muy elaborada que muestra mucha información de depuración, aunque no responde directamente a la pregunta original: cómo hacerlo call other.batcon los parámetros dados :( ¿Dónde escribo "other.bat"? ¿Es posible eliminar "Índice (s) de parámetros para extraer "consulta? Además, clsno es necesario en la solución final.
izogfif