スクリプトの先頭に追加@echo off
して実行すると、次の出力が得られました。
1- version1
2- --define
3- delivery
2
version1
3
--define
y
4
delivery
私の理解が正しければ、問題はy
下から 3 行目です。
あなたが得てy
いる理由は@echo !argVec[!y!]!
. @echo
これは, !argVec[!
, y
,としてトークン化されます。これは、「変数の内容をエコーし、次にエコーし、変数!]!
の内容をエコーすることを意味します。変数または変数がないため、これは「エコー」に縮小されます。!argVec[!
y
]
!argVec[!
]
y
それを修正するために、この SO answerには多くの良い情報があります。あなたの目的のために、その投稿の重要な部分はこれです:
FOR/IF 内でインデックスが変更されたときに要素の値を取得するには、要素を 2 つのパーセントで囲み、コマンドの前にcall
.
これは、あなたがやりたいと思うスクリプトのバージョンです。
@echo off
set inputArg=%*
setlocal enabledelayedexpansion
set Count=0
for %%x in (%inputArg%) do (
set /A Count+=1
set "argVec[!Count!]=%%~x"
)
for /L %%i in (1,1,%Count%) do echo %%i- !argVec[%%i]!
for /L %%x in (1,1,%Count%) do (
set /A y=%%x+1
@echo !y!
@echo !argVec[%%x]!
if "!argVec[%%x]!"=="--define" (
@call echo %%argVec[!y!]%%
)
)
endlocal
それは印刷します:
1- version1
2- --define
3- delivery
2
version1
3
--define
delivery
4
delivery
画面にエコーすることはおそらく最終的な目標ではないことを理解しています。そのため、スクリプトを変更して本当にやりたいことを実行するときは、「配列」全体を二重のパーセントで囲み、インデックスを感嘆符で囲み、前に感嘆符を使用することを忘れないでください。であなたのコマンドcall
。
たとえば、比較条件を追加する場合は、次のように の内容をargVec[y]
の一時変数に設定し、call
その一時変数を で使用しますif
。
@echo off
set inputArg=%*
setlocal enabledelayedexpansion
set Count=0
for %%x in (%inputArg%) do (
set /A Count+=1
set "argVec[!Count!]=%%~x"
)
for /L %%i in (1,1,%Count%) do echo %%i- !argVec[%%i]!
for /L %%x in (1,1,%Count%) do (
set /A y=%%x+1
@echo !y!
@echo !argVec[%%x]!
@call set tmpvar=%%argVec[!y!]%%
if "!tmpvar!"=="--define" (
echo "found it"
)
)
endlocal
最新の出力:
1- version1
2- --define
3- delivery
2
version1
"found it"
3
--define
4
delivery