42

複数の引数を持つバッチ スクリプトがあります。それらの合計数を読み取ってから、次のように 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

4

6 に答える 6

69
@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..."
于 2013-11-07T13:52:20.553 に答える
28
:loop
@echo %1
shift
if not "%~1"=="" goto loop
于 2016-09-29T17:27:13.933 に答える
13

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
于 2013-11-07T12:43:26.320 に答える
8

コードを賢明ではなく短く保つ場合は、

for %%x in (%*) do (
   echo Hey %%~x 
)
于 2016-12-05T12:55:09.413 に答える
2

単純な繰り返しのために、コードの最後に「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
于 2016-07-15T10:00:21.627 に答える