1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

DOS高度活用バッチ処理チュートリアル 第6章 ifコマンドの解説

2022-01-25 22:44:42

今すぐ開始

CMDでIFを使用する /? IFのシステムヘルプを開くと(全部は挙げませんが自分で見てください)、IFの3つの基本的な使い方があることがわかりますよ。
バッチプログラムの中で条件処理を実行する。

IF [NOT] ERRORLEVEL 数字コマンド
IF [NOT] string1==string2 コマンド
IF [NOT] EXIST filename コマンド

  NOTは、Windows XPが偽の場合にのみコマンドを実行することを指定します。

  ERRORLEVEL number 最後に実行したプログラムが指定された数値以上の終了コードを返した場合、その条件が真であることを指定します。
  string1==string2 指定されたリテラル文字列が一致する場合に真となる条件を指定します。
  EXIST filename 指定されたファイル名が存在する場合に真となる条件を指定します。

  command 条件を満たした場合に実行するコマンドを指定します。指定した条件が FALSE の場合、ELSE キーワードの後にコマンドを実行する ELSE コマンドを続けることができます。

ELSE句は、IFの後の同じ行に書かなければならない。例えば

IF EXIST ファイル名 (
    ファイル名を削除する
) ELSE (
    echo ファイル名がありません
)


初使用です。IF [NOT] ERRORLEVEL 数字コマンド

この使い方の基本的な目的は、前のコマンドのコードを判定して次のステップを決定することです。
一般に、直前のコマンドの結果コードは、0を表すquot;success"と1を表すquot;failure"の2つだけである。

一例です。

@echo off
net user
IF %ERRORLEVEL% == 0 echo net user executed successfully!
pause

直前のコマンドが正常に実行されたかどうかを判断するための簡単な方法です。

注意すると、この使い方はヘルプによると "IF %ERRORLEVEL% == 0 echo net user 実行に成功! "この行は次のように記述する必要があります:IF ERRORLEVEL 0 echo net user 実行に成功! "ヘルプによると、この行はヘルプによると、IF %ERRORLEVEL == 0 echo net user実行に成功! "ヘルプはヘルプに記述されていない。

では、なぜこのような書き方をするのでしょうか。自分でコードを変更して実行すると、エラーが見つかりますよ。バグなのか、私が誤解しているのかわかりませんが・・・。

追加してください。これはバグではなく、if errorlevel文の特徴です。if errorlevel 0 ......という構文を使うと、「エラーコードの値が0以上であれば、操作が実行される」という意味になり、if %errorlevel%==0 ......という構文を使うと、「エラーコードの値が0に等しければ、操作が実行される」という意味になるのだそうです。この2つの構文は意味が異なるため、前者の構文を使用した場合、エラーコードの記述順は大きいものから小さいものへとなります

ERRORLEVEL% 直前のコマンドの結果コードを返すシステム変数です! "Success"は0、quot;Failure"は1で表します。もちろん、基本の2数値を使う場合は、他のパラメータも存在します。
一般的に、最後のコマンド実行結果のコードは、0と言った"Success"と1と言った"Failure"の2つの結果のみです。

これはあくまで一般的なケースで、実際には、エラーレベルの戻り値は0から255の間で指定できます。例えば、xcopyには5つのデフォルトのエラーレベルの値があり、これは5つの実行状態を示しています。

終了コード 説明
0 ファイルコピーにエラーがない。
1 if errorlevel 2 echo.
2 ユーザーがCTRL+Cキーを押してxcopyを終了しました。
4 初期化エラーが発生しました。メモリまたはディスク容量が不足しているか、コマンドラインに無効なドライブ名または構文が入力されました。
5 ディスク書き込みエラーが発生しました。

上記のxcopyコマンドの5つの終了ケースを決めるには、次のように書けばよい。
if errorlevel 5 echo ディスク書き込みエラーが発生しました。
if errorlevel 4 echo 初期化エラーが発生しました。
if errorlevel 2 echoユーザーは CTRL+C を押して xcopy を中断しました。
if errorlevel 1 echo if errorlevel 2 echo
if errorlevel 0 echo ファイルコピーにエラーはありません。
このときだけ、正しく実行されます。

追加が完了しました。

初心者が理解しやすいように、もう少し例を挙げます。

@echo off
net usertest
IF %ERRORLEVEL% == 1 echo net user execution has failed!
pause

これは、前のコマンドの実行に失敗したかどうかを判断するためのものです

@echo off
set /p var=type a random command:
%var%
if %ERRORLEVEL% == 0 goto yes
goto no
:yes
echo !var! Executed successfully
pause
exit
:no
echo Basically the execution failed...
pause

これは、入力されたコマンドを元に、成功したか失敗したかを自動的に判断しているのです

以下はその簡略版です。

@echo off
set /p var=type a random command:
%var%
if %ERRORLEVEL% == 0 (echo %var% executed successfully) ELSE echo %var% failed to execute!
pause

else の後に、実行に失敗した後のアクションが続きます!

もちろん、if else文を何行かに分けて、見栄えをよくすることもできますが...。

@echo off
set /p var=type a random command:
%var%
if %ERRORLEVEL% == 0 (
  echo !var! Executed successfully!
  ) ELSE (
  echo Basically the execution failed...
  )
pause

ここで紹介する2つの略語は、IF [NOT] ERRORLEVEL番号コマンド方式だけでなく、IFの3つの構文すべてで使用可能です。

2つ目の使用方法です。IF [NOT] string1==string2 コマンド

変数や文字の値が等しいかどうかを比較するときに使用します。

@echo off
set /p var=Please enter the first comparison character:
set /p var2=Please enter the second comparison character:
if %var% == %var2% (echo we are equal) ELSE echo we are not equal
pause

上の例は、入力した値が等しいかどうかを判断するものですが、同じ文字を入力しても、その後にスペースが続く場合は、そのように判断します。
スペースがある入力を等しくないようにするにはどうしたらよいでしょうか。比較文字をダブルクォートで囲むのです。

@echo off
set /p var=Please enter the first comparison character:
set /p var2=Please enter the second comparison character (try entering an extra space):
if "%var%" == "%var2%" (echo we are equal) ELSE echo we are not equal
pause

3回目の使用 IF [NOT] EXIST ファイル名コマンド

これは、ファイルやフォルダーが存在するかどうかを判断するための構文です。

@echo off
if exist "c:\test" (echo exists file) ELSE echo does not exist file
pause

ファイルパスが引用符で囲まれているのは、パスにスペースが含まれないようにするためです。パスにスペースがある場合は、二重引用符を追加すればエラーになりません

この構文にはあまり使い道がなく、基本的にそれだけなので、説明は省きます。

また、各IFの使い方の後に[NOT]文がありますが、これはどういう意味なのでしょうか?もしこれを追加すれば、条件が真でないときに最初に判断することを意味し、追加しなければ、上の例のように、条件が真であるときに最初に判断することを意味します。

@echo off
if not exist "c:\test" (echo exists file) ELSE echo does not exist file
pause

NOTを追加し、どのような実装の結果である、あなたのCディスクは、すべてでc: \testの下で、彼はまだ&quotを表示します;ファイルの存在"は、NOTの追加は、最初に失敗の条件を決定することを意味します それを理解し、これに変更するには、上記の例では、正しくなります

@echo off
if not exist "c:\test" (echo does not exist file) ELSE echo exists file
pause

4つ目の使い方 IFで強化された使い方

IF [/I] string1 compare-op string2 command #パラメータ /I は大文字小文字を区別しないことを意味します。
IF CMDEXTVERSION番号コマンド
IF DEFINED variable command # 変数が存在するかどうかを判断する、とても便利なコマンド

CMDEXTVERSION 条件は、ERRORLEVEL と同じことを行いますが、コマンド拡張機能に関連する内部バージョン番号と比較する点が異なります。最初のバージョンは 1 で、コマンド拡張機能が大幅に強化されるたびに、バージョン番号は 1 つずつ増加します。コマンド拡張機能が無効な場合、CMDEXTVERSION 条件は真ではありません。

環境変数が定義されている場合、DEFINED条件はEXISTSと同じように動作します。
IF DEFINED 変数コマンド
IF NOT "変数 ==""コマンド
上の2つのコマンドは、同じ効果を持ちます。

変数が未定義、つまりNULLになるように"set variable="コマンドを使用します。

簡単に言うと、変数がNULLの場合は未定義、NULLでない場合は定義済みということです。
ステートメント IF DEFINED variable コマンドで変数が存在するかどうかを判断する場合、 variable はブートストラップ % を除いた変数名であり、%variable% と書くとエラーになるので注意してください。


if defined aa (echo 変数aaが存在する) else (echo 変数aaが存在しない)
Run shows: 変数aaが存在しない


set aa=123
aa= に設定します。
if defined aa (echo 変数 aa exists) else (echo 変数 aa does not exist)
Run shows: 変数aaが存在しない


@echo off
if a == A (echo we are equal) ELSE echo we are not equal
pause

実行すると表示されます。私たちは平等ではありません

@echo off
if /i a == A (echo we are equal) ELSE echo we are not equal
pause

Iをつけると大文字小文字が区別されないので、イコールになる!

末尾に数字を判断するための記号があります

EQU - と等しい
NEQ - 等しくない
LSS - 未満
LEQ - 以下であること
GTR - より大きい
GEQ - 以上

例を挙げれば、数学はみんな知っている...。これ以上詳しくは説明しませんが

@echo off
set /p var=Please enter a number:
if %var% LEQ 4 (echo I am less than or equal to 4) ELSE echo I am not less than or equal to 4
pause

上記はifコマンドの紹介です。