Les fichiers de commandes Windows ont-ils une construction% *?

10

Dans un fichier batch, dois-je faire (par exemple) ce qui suit?

@echo off
call other.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
Roger Lipscombe
la source
Semblable à $ @ sur Unix
An̲̳̳drew

Réponses:

10

Les fichiers batch Windows (depuis Windows XP, mais peut-être plus tôt) prennent en charge la %*construction, qui évalue tous les paramètres à partir de% 1.

Malheureusement, cela n'honore pas la SHIFTcommande, donc ce qui suit ne fonctionnera pas:

@echo off
set EATEN=%1
shift

call other.bat %*

Il transmettra toujours le premier paramètre au deuxième fichier de commandes.

Roger Lipscombe
la source
2
Remarque: %*préserve les espaces / guillemets.
Aaron Digulla
10

Vous pouvez rassembler tous les arguments en utilisant quelque chose comme:

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

:done
(use %args% here)

Cela fonctionne quel que soit le nombre d'arguments.

Graeme Perrow
la source
1

Oui, ils le font.

Vous pouvez écrire votre exemple comme suit:

@echo off
call other.bat %*

Aussi: le décalage est pris en charge sur les fenêtres ... Voir ceci .
Mais en effet, ce dernier lien confirme que shift ne fonctionne pas en combinaison avec% *:

• L'utilisation de% * avec shift
  Shift n'a aucun effet sur le paramètre batch% *.

fretje
la source
Désolé les liens étaient mauvais ... devraient être corrigés maintenant.
fretje
(quote) L'utilisation de% * avec shift Shift n'a aucun effet sur le paramètre batch% *. (/ quote)
Wedge
Pourquoi le downvote? La question portait sur% * et non sur le décalage.
fretje
Votre première réponse avait seulement «Oui, c'est vrai», ce qui n'était pas un lien (ou une réponse) évident. Votre dernière modification est bien plus une réponse décente, c'est peut-être pour cela que ...
thijs
En fait, le downvote s'est produit après avoir ajouté plus d'explications. Et je suis d'accord que le lien sur "Oui ils le font" n'était pas évident, mais c'était une réponse exacte à la question posée ...
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
la source
Préserve tous les délimiteurs spéciaux. Prend en charge autant de paramètres que possible dans une limite de 8175 caractères par ligne de commande (y compris le nom de fichier de lot, CRLF et le chemin de lot si spécifié). Les paramètres peuvent être regroupés avec des guillemets doubles (par exemple, "sw1 = / quiet / skip: 1 / start = 3"). Remarque: les guillemets doubles sont conservés. Le comportement des guillemets doubles est attendu (même s'il n'est pas utilisé correctement, par exemple. Utilisé uniquement seul ou "" ou ""). Veuillez déboguer le code avant de faire un rapport de bogue.
Dharma Leonardi
C'est une réponse très élaborée montrant beaucoup d'informations de débogage, mais elle ne répond pas directement à la question d'origine: comment call other.batavec des paramètres donnés :( Où dois-je écrire "other.bat"? Est-il possible de supprimer "Index (s) de paramètre à extraire" "requête? En outre, clsn'est pas nécessaire dans la solution finale.
izogfif