Os arquivos em lote do Windows têm uma construção% *?

10

Em um arquivo em lotes, eu tenho que fazer (por exemplo) o seguinte?

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

Respostas:

10

Os arquivos em lotes do Windows (desde o Windows XP, mas possivelmente anteriormente) oferecem suporte à %*construção, que avalia todos os parâmetros a partir de% 1 em diante.

Infelizmente, isso não respeita o SHIFTcomando, portanto o seguinte não funcionará:

@echo off
set EATEN=%1
shift

call other.bat %*

Ele ainda passará o primeiro parâmetro para o segundo arquivo em lote.

Roger Lipscombe
fonte
2
Nota: %*preserva espaços em branco / aspas.
Aaron Digulla
10

Você pode reunir todos os argumentos usando algo como:

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

:done
(use %args% here)

Isso funciona independentemente de quantos argumentos existem.

Graeme Perrow
fonte
2

Se você quiser pular os três primeiros parâmetros, por exemplo, e repassar o restante:

@echo off
for /f "tokens=1-3*" %%a in ("%*") do (
   set par1=%%a
   set par2=%%b
   set par3=%%c
   set therest=%%d
   )

call other.bat %therest%

Pode haver problemas com aspas nos parâmetros.

parabéns a Patrick Cuff, /programming/382587/how-to-get-batch-file-parameters-from-nth-position-on

matt wilkie
fonte
1

Sim, eles fazem.

Você pode escrever seu exemplo da seguinte maneira:

@echo off
call other.bat %*

Além disso: o shift é suportado no Windows ... Veja isso .
Mas, de fato, esse último link confirma que a mudança não funciona em combinação com% *:

• O uso de% * com shift
  Shift não afeta o parâmetro de lote% *.

fretje
fonte
Desculpe, mas os links estavam ruins ... deve ser corrigido agora.
#
. (citação) Usando% * com Shift mudança não tem efeito sobre o% * parâmetro batch (/ quote)
Wedge
Por que o voto negativo? A pergunta era sobre% * e não sobre turnos.
#
Sua primeira resposta teve apenas "Sim, eles têm", o que não era um link (ou resposta) óbvio. Sua última edição é muito mais de uma resposta decente, talvez seja por isso ...
thijs
Na verdade, o voto negativo aconteceu depois que eu adicionei mais explicações. E eu concordo que o link em "Sim eles" não era óbvio, mas foi uma resposta exata para a pergunta na mão ...
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
fonte
Preserva todos os delimitadores especiais. Suporta quantos parâmetros podem ser ajustados em um caractere 8175 por limite de linha de comando (incluindo nome do arquivo em lote, CRLF e caminho do lote, se especificado). Os parâmetros podem ser agrupados com aspas duplas (por exemplo, "sw1 = / quiet / skip: 1 / start = 3"). Nota: As aspas duplas são preservadas. O comportamento de aspas duplas é esperado (mesmo se usado incorretamente, por exemplo, usado apenas isoladamente ou "" ou ""). Por favor, depure o código antes de fazer um relatório de erro.
Dharma Leonardi
Essa é uma resposta muito elaborada, que mostra muitas informações de depuração, embora não responda diretamente à pergunta original: como call other.batcom determinados parâmetros :( Onde eu escrevo "other.bat"? É possível remover "Índice (s) de parâmetros para extrair "query? Além disso, clsnão é necessário na solução final.
izogfif 17/09/18