1

現在の引数と比較する次の引数を取得できるようにしたい。したがって、argVec が「--define」に等しい場合、次の引数をエコーし​​たいのです。「配達」ではなく「y」という結果が得られます。

私の入力は次のとおりです。Cmd version version1 --define delivery

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" (
    @echo !argVec[!y!]!
  )
)
endlocal
4

2 に答える 2

1

スクリプトの先頭に追加@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
于 2015-08-11T21:49:05.490 に答える
0

この方法で遅延展開を「ネスト」することはできません。

@echo !argVec[!y!]!

この問題を解決するにはいくつかの方法があります。最も効率的なものはこれです:

for %%y in (!y!) do @echo !argVec[%%y]!

編集コメントに記載されている追加のリクエストが解決されました。

同じメソッドを使用して値を取得しargVec[!y!]、任意の方法で使用できます。例えば:

for %%y in (!y!) do if "!argVec[%%y]!"=="delivery" echo true1
于 2015-08-11T22:25:36.030 に答える