I file batch di Windows hanno una costruzione% *?


Risposte:


10

I file batch di Windows (da Windows XP, ma forse prima) supportano il %*costrutto, che valuta tutti i parametri da% 1 in poi.

Sfortunatamente, questo non rispetta il SHIFTcomando, quindi non funzionerà:

@echo off
set EATEN=%1
shift

call other.bat %*

Passerà comunque il primo parametro al secondo file batch.


2
Nota: %*conserva spazi bianchi / virgolette.
Aaron Digulla,

10

Puoi raccogliere tutti gli argomenti insieme usando qualcosa come:

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

:done
(use %args% here)

Funziona indipendentemente da quanti argomenti ci siano.



1

Si lo fanno.

Puoi scrivere il tuo esempio come segue:

@echo off
call other.bat %*

Inoltre: shift è supportato su Windows ... Vedi questo .
Ma in effetti, l'ultimo collegamento conferma che shift non funziona in combinazione con% *:

• L'uso di% * con shift
  Shift non ha alcun effetto sul parametro batch% *.


Spiacenti, i collegamenti erano errati ... dovrebbero essere risolti ora.
fretje,

(quote) L'uso di% * con shift Shift non ha alcun effetto sul parametro batch% *. (/ quote)
Wedge

Perché il downvote? La domanda era su% * non sul turno.
fretje,

La tua prima risposta aveva solo "Sì, sì" che non era un collegamento (o una risposta) ovvio. La tua ultima modifica è molto più di una risposta decente, forse è per questo che ...
thij

In realtà il downvote è avvenuto dopo che ho aggiunto ulteriori spiegazioni. E sono d'accordo sul fatto che il link "Sì, lo fanno" non era ovvio, ma era una risposta esatta alla domanda in corso ...
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

Conserva tutti i delimitatori speciali. Supporta quanti parametri è possibile inserire in un limite di 8175 caratteri per limite della riga di comando (inclusi nome file batch, CRLF e percorso batch se specificato). I parametri possono essere raggruppati con virgolette doppie (ad es. "Sw1 = / quiet / skip: 1 / start = 3"). Nota: le virgolette doppie vengono conservate. Sono previsti comportamenti con virgolette doppie (anche se utilizzate in modo errato, ad es. Utilizzate solo singolarmente o "" o ""). Esegui il debug del codice prima di fare una segnalazione di bug.
Dharma Leonardi,

Questa è una risposta molto elaborata che mostra molte informazioni di debug, sebbene non risponda direttamente alla domanda originale: come fare call other.batcon determinati parametri :( Dove scrivo "other.bat"? È possibile rimuovere "Indice / i parametri per estrarre "query? Inoltre, clsnon è necessario nella soluzione finale.
izogfif
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.