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


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.


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.



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% *.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.