[解決済み] IF... OR IF...をWindowsのバッチファイル内で実行する
質問
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
オプションの有無によって、大文字と小文字を区別したり、区別しなかったりできることです。
関連
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] N日以上前のファイルを削除するバッチファイル
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
-
[解決済み】バッチ/cmdで "コメントアウト"(コメント追加)するには?
-
[解決済み】Windowsのバッチファイル:.batと.cmdの違いは?
-
[解決済み] CMDがAdministratorとして実行されているか、または昇格した特権を持っているかどうかを検出する方法は?
-
[解決済み] hostednetworkを起動できない
-
[解決済み] Windows バッチ: 日付の書式を変数に変換する
-
[解決済み] 特定のファイルだけを含むディレクトリ構造をコピーする方法(Windowsのバッチファイルを使用)。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
.appref-msのファイル拡張子について
-
[解決済み】DOSバッチでの論理演算子("and"、"or")について
-
[解決済み] パラメータ中の二重引用符のエスケープ
-
[解決済み] ダウンロードした.boxファイルをVagrantに追加するには?
-
[解決済み] VIM Ctrl-VとWindows Pasteの競合
-
[解決済み] IE10はIE7モードでレンダリングされます。強制的に標準モードにする方法は?
-
[解決済み] Windows の 'tail' コマンドに相当するもの [重複]。
-
[解決済み] Windowsで.gitconfigの場所を変更する
-
[解決済み] Windowsのgit diffで「端末が完全に機能していない」という警告が出るのはなぜですか?
-
[解決済み] ActivePerlとStrawberry Perl for Windowsのどちらを選べばいいのでしょうか?重複