1. ホーム
  2. windows

[解決済み] IF... OR IF...をWindowsのバッチファイル内で実行する

2022-10-06 20:07:07

質問

Windowsのバッチファイルで、IF OR IF条件文を書く方法はありますか?

例えば、以下のような感じです。

IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE

どのように解決するのですか?

zmbq の解決方法は良いのですが、FOR DO(...) ループのようなコード ブロックの中など、すべての状況で使用できるわけではありません。

代替案は、インジケータ変数を使用することです。それを未定義に初期化し、OR条件のいずれかが真である場合にのみそれを定義します。そして、最終的なテストとして IF DEFINED を使用します - 遅延展開を使用する必要はありません。

FOR ..... DO (
  set "TRUE="
  IF cond1 set TRUE=1
  IF cond2 set TRUE=1
  IF defined TRUE (
    ...
  ) else (
    ...
  )
)

arasmussenが使っているELSE IFロジックを追加すれば、1番目の条件が真であれば少しは速く実行できるかもしれませんが、私は決して気にしません。

追記 - とほぼ同じ回答で重複した質問です。 IFステートメントでORを使用する WinXPバッチスクリプト

最終補遺 - 変数が大文字小文字を区別しない値のリストのどれかであるかどうかをテストするための私のお気に入りのテクニックを忘れるところでした。許容される値の区切られたリストを含むテスト変数を初期化し、それから変数がリストの中にあるかどうかをテストするために検索と置換を使用します。これは非常に高速で、任意の長さのリストに対して最小限のコードしか使用しません。ただし、遅延展開(または、CALL %%VAR%%トリック)が必要です。また、このテストはCASE INSENSITIVEです。

set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" (echo true) else (echo false)

上記は、VARに = を含む場合、失敗する可能性があるので、テストは確実ではありません。

VARの現在値にアクセスするために遅延展開が必要なブロック内でテストを行う場合、次のようになります。

for ... do (
  set "TEST=;val1;val2;val3;val4;val5;"
  for /f %%A in (";!VAR!;") do if "!TEST:%%A=!" neq "!TEST!" (echo true) else (echo false)
)

VAR内の期待値によっては、"delims="のようなFORオプションが必要な場合があります。

上記の戦略は = であっても、もう少しコードを追加することで信頼できるものになります。

set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" if "!TEST:;%VAR%;=;%VAR%;"=="!TEST!" echo true

しかし、今、私たちは指標となる変数を追加しない限り、ELSE 節を提供する能力を失いました。コードは少し醜く見え始めましたが、VAR が大文字と小文字を区別しない任意の数のオプションのいずれかであるかどうかをテストするための、最も性能の良い信頼できる方法であると思います。

最後に、よりシンプルなバージョンがありますが、各値に対して 1 つの IF を実行する必要があるため、若干遅いと思います。Aacini は、前述のリンクで受け入れられた回答へのコメントで、この解決策を提供しました。

for %%A in ("val1" "val2" "val3" "val4" "val5") do if "%VAR%"==%%A echo true

値のリストには*や?を含めることはできず、値や %VAR% は引用符を含んではいけません。引用符は %VAR% のようなスペースや特殊文字が含まれている場合、問題が発生します。 ^ , & などです。このソリューションのもう一つの制限は、インジケータ変数を追加しない限り、ELSE句のオプションが提供されないことです。利点は、IF句の有無によって大文字小文字を区別したり、区別しなかったりできることです。 /I オプションの有無によって、大文字と小文字を区別したり、区別しなかったりできることです。