web-dev-qa-db-fra.com

Batch-Script - Itérer à travers des arguments

J'ai un script de lot avec plusieurs arguments. Je lis le nombre total d'entre eux, puis lance une boucle for comme ceci:

@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do set /A argCount+=1
echo Number of processed arguments: %argCount%

set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
set /a counter=!counter!+1 )

Ce que je veux faire maintenant, c'est utiliser ma variable courante (x ou counter) pour accéder aux arguments d'entrée. Je pense aobut quelque chose comme ceci:

REM Access to %1 
echo %(!counter!)

Dans un monde idéal, cette ligne devrait afficher mon premier argument en ligne de commande, mais ce n'est évidemment pas le cas. Je sais que je fais quelque chose de mal avec l'opérateur %, mais est-ce que je pourrais quand même accéder à mes arguments de la sorte?

// edit: Juste pour clarifier les choses - le problème est que %(!counter!) me fournit la valeur de la variable counter. Signification pour counter=2 il me donne 2 et non le contenu de %2.

26
Toby

voici un moyen d'accéder au deuxième argument (par exemple) (vous pouvez le mettre dans la boucle/l):

@echo off
setlocal enableDelayedExpansion
set /a counter=2
call echo %%!counter!
endlocal

alors:

setlocal enableDelayedExpansion
set /a counter=0
for /l %%x in (1, 1, %argCount%) do (
 set /a counter=!counter!+1
 call echo %%!counter! 
)
endlocal
11
npocmaka
@echo off
setlocal enabledelayedexpansion

set argCount=0
for %%x in (%*) do (
   set /A argCount+=1
   set "argVec[!argCount!]=%%~x"
)

echo Number of processed arguments: %argCount%

for /L %%i in (1,1,%argCount%) do echo %%i- "!argVec[%%i]!"

Par exemple:

C:> test One "This is | the & second one" Third
Number of processed arguments: 3
1- "One"
2- "This is | the & second one"
3- "Third"

Un autre:

C:> test One Two Three Four Five Six Seven Eight Nine Ten Eleven Twelve etc...
Number of processed arguments: 13
1- "One"
2- "Two"
3- "Three"
4- "Four"
5- "Five"
6- "Six"
7- "Seven"
8- "Eight"
9- "Nine"
10- "Ten"
11- "Eleven"
12- "Twelve"
13- "etc..."
41
Aacini
:loop
@echo %1
shift
if not "%~1"=="" goto loop
11
Jay Taylor

Si garder le code court plutôt que sage, alors

for %%x in (%*) do (
   echo Hey %%~x 
)
3
h22
@ECHO OFF
SETLOCAL
SET nparms=0
FOR /l %%i IN (1,1,20) DO (
 SET myparm=%%i
 CALL :setparm %*
 IF DEFINED myparm SET nparms=%%i&CALL ECHO Parameter %%i=%%myparm%%
)
ECHO there were %nparms% parameters in %*
GOTO :EOF

:setparm
IF %myparm%==1 SET myparm=%1&GOTO :EOF
shift&SET /a myparm -=1&GOTO setparm
GOTO :eof

Cela devrait montrer comment extraire des paramètres aléatoires par position.

2
Magoo

Pour une simple itération, ne pouvons-nous pas simplement rechercher des arguments supplémentaires avec "shift/1" à la fin du code et une boucle en retour? Cela gérera plus de 10 arguments, limite supérieure non testée.

:loop

:: Your code using %1
echo %1

:: Check for further batch arguments.     
shift /1
IF [%1]==[] (
goto end
) ELSE (
goto loop
)

:end
pause
1
Gavin