配列風変数を比較して処理する事は可能でしょうか?

hycafeさんからバッチファイルで配列を使う(環境変数を使って配列変数風に使う)方法についてのエントリーにコメントをいただきました。

hycafe 2011/02/10 10:38

配列風変数を比較して処理する事は可能でしょうか?

テキストの内容を配列風変数に代入して比較後に処理を実施したいのですが、下記のような例でうまく動きません。

***********************
REM テキストの内容を取得します。
REM テキスト内容は「リンゴ」、「バナナ」とします。
for /f %%i in (%Windir%test.txt) do @call :add %%i

:add
set x[%i%]=%1
REM 配列の比較     
call if %%x[%i%]%%==リンゴ (
echo 赤色です。
) else (
echo 黄色です。
)
***********************

ご指摘願います。

http://d.hatena.ne.jp/jak-san/20090308/1236501217#c1297301920

ためしてみましたが、call set は動きますが、call if は使えないようですね。
赤色、黄色両方がechoされるのは、call if 〜 ( までが無視されて、ただのecho文
として実行されているのだと思われます(推測)。


個人的にはifの複文は好みでないのですがelseを使いたいのでしょうね。


こんなときは、いったんcall setで別の変数にいれるか、cmd /c を使う方法を
代案として思いつきました。

こんなふうに直してみました。

代案1

REM テキストの内容を取得します。
REM テキスト内容は「リンゴ」、「バナナ」とします。
set i=0
for /f %%i in (%Windir%\test.txt) do @call :add %%i

:add
set x[%i%]=%1
REM 配列の比較     
call set tmp=%%x[%i%]%%
if /%tmp%/==/リンゴ/ ( 
echo 赤色です。
) else (
echo 黄色です。
)
set /a i+=

代案2

REM テキストの内容を取得します。
REM テキスト内容は「リンゴ」、「バナナ」とします。
set i=0
for /f %%i in (%Windir%\test.txt) do @call :add %%i

:add
set x[%i%]=%1
REM 配列の比較     
cmd /C "if /%%x[%i%]%%/==/リンゴ/ ( echo 赤色です。 ) ELSE ( echo 黄色です。)"
set /a i+=

いちどお試しください。