web-dev-qa-db-ja.com

Batch-Script-引数を反復処理する

複数の引数を持つバッチスクリプトがあります。私はそれらの総数を読んでいて、次のようなforループを実行しています。

_@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 )
_

ここでやりたいことは、実行中の変数(xまたはcounter)を使用して入力引数にアクセスすることです。私はこのような何かを考えています:

_REM Access to %1 
echo %(!counter!)
_

理想的な世界では、この行は最初のコマンドライン引数を出力するはずですが、明らかにそうではありません。 _%_演算子で何か間違ったことをしていることは知っていますが、とにかくこのような引数にアクセスできますか?

//編集:わかりやすくするために、問題は%(!counter!)が変数counterの値を提供することです。 _counter=2_の意味は_2_の内容ではなく_%2_を提供します。

31
Toby

2番目の(たとえば)引数にアクセスする1つの方法を次に示します(これはfor/lループに入れることができます):

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

そう:

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]!"

例えば:

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

別のもの:

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..."
47
Aacini
:loop
@echo %1
shift
if not "%~1"=="" goto loop
15
Jay Taylor

コードを賢くするのではなく短くするために、

for %%x in (%*) do (
   echo Hey %%~x 
)
4
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

これは、位置によってランダムパラメーターを抽出する方法を示しているはずです。

2
Magoo

単純な繰り返しのために、コードの最後に「shift/1」を付けて追加の引数をチェックしてループバックすることはできませんか?これは10個以上の引数を処理しますが、上限はテストされていません。

: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