制御構文風コマンド if

【連載】

LinuxユーザーのためのWindowsコマンド超入門

【第27回】制御構文風コマンド if

[2019/03/14 06:30]後藤大地 ブックマーク ブックマーク

  • サーバ/ストレージ

サーバ/ストレージ

制御構文風コマンド if

Linuxのシェルには制御構文が存在しており、これを利用することで条件分岐や繰り返し処理を実行できる。Windowsのコマンドプロンプトにはシェルのような制御構文と言い切れるような機能が存在していないが、似たようなことを行うための機能は用意されており、簡単な分岐処理や繰り返し処理を実行できる。

コマンドプロンプトではifというコマンドを使うことで、制御構文のif的な振る舞いをさせることができる。ifコマンドの基本的な使い方は次のとおり。

ifコマンドの基本的な使い方

if [not] errorlevel 番号 コマンド [else 式]
if [not] 文字列1==文字列2 コマンド [else 式]
if [not] exist ファイルパス コマンド [else 式]

コマンドエクステンションが有効になっている場合には次のような使い方もできる。

ifコマンドの基本的な使い方 (コマンドエクステンション有効時)

if [/i] 文字列1 比較演算子 文字列2 コマンド [else 式]
if cmdextversion 番号 コマンド [else 式]
if defined 変数 コマンド [else 式]

ifコマンドに指定するパラメータやその内容は次のとおり。

パラメータ 内容
コマンド 条件が真だった場合に実行するコマンド
not 条件が偽の場合に真とする
errorlevel 番号 直前にcmd.exeによって実行されたコマンドの終了コードが指定した終了コード以上だった場合に真とする
文字列1==文字列2 文字列1と文字列2が同じだった場合に真とする。値はリテラル文字列または%1などのバッチ変数。リテラル文字列は引用符で囲む必要なし
/i 上記文字列比較において指定すると、大文字と小文字を区別しなくなる
exist ファイルパス ファイルが存在した場合に真となる
cmdextversion 番号 cmd.exeのコマンド拡張機能に関連付けられている内部バージョン番号が指定された番号以上だった場合に真となる
defined 変数名 指定された変数が定義されていた場合に真となる
else以降の記述する内容
比較演算子 内容
EQU 等しい
NEQ 等しくない
LSS より小さい
LEQ 同じまたはより小さい
GTR より大きい
GEQ 同じまたはより大きい

コマンドプロンプトのifコマンドはプログラミング言語における分岐構文と捉えるよりも、コマンドとして分岐処理を類似的に提供するものだと考えた方がわかりやすいかもしれない。しかし、( ) でグルーピングすることでほかのプログラミング言語におけるif制御構文のような書き方もできる。Windowsのバッチファイルなどではifをネストするような使い方はあまりしないが、エラー発生時の処理などを書くには不可欠なので、基本的な使い方は把握しておきたい。

ifコマンドの実行サンプル

ifコマンドの実行サンプルを次に示す。次のサンプルはマニュアルにも掲載されているもので、カレントディレクトリにproduct.datというファイルが存在していない場合に「Cannot find data file」というメッセージを出力するというものだ。

ifコマンドの実行サンプル

C:\Users\daich>if not exist product.dat echo Cannot find data file
Cannot find data file

C:\Users\daich>

このサンプルからは、ifコマンドは基本的に1行にまとめて書くこと、existsという指定、notという指定、条件が真だった場合に実行するコマンドの指定方法、などを知ることができる。ifコマンドがどのように動作するかを簡単に知るうえでよいサンプルと言える。

notを抜いたものでも動作を確認しておこう。たとえば次の実行例はカレントディレクトリにDocumentsというディレクトリが存在する場所で、ifコマンドを実行した場合の出力例だ。Documentsというディレクトリが存在しているので、exists Documentsという式は真と評価され、その後のecho Documents existsが実行されている。

ifコマンドの実行サンプル その2

C:\Users\daich>if exist Documents echo Documents exists
Documents exists

C:\Users\daich>

コマンドの実行を( )で囲むようにすると、次のように複数行に分けてifコマンドを書くことができる。こうなってくるとシェルスクリプトやプログラミング言語的のようになってくる。

ifコマンドを複数行に書く方法

C:\Users\daich>if exist Documents (
More?     echo Documents exists
More? ) else (
More?     echo Documents does not exist
More? )
Documents exists

C:\Users\daich>

コマンドプロンプトのifコマンドはそれほど強力なものではないので、あまり複雑なことはできない。ただし、バッチファイルではラベル付きgoto機能が利用できるため、ifとgotoの組み合わせで処理を分岐させることもできる。たとえばマニュアルには次の2つのサンプルコードが掲載されており、ifとgotoの組み合わせでどのようなことができるのかわかるようになっている。

ifとgotoの組み合わせ例 その1

:begin
@echo off
format a: /s
if not errorlevel 1 goto end
echo An error occurred during formatting.
:end
echo End of batch program.

ifとgotoの組み合わせ例 その2

goto answer%errorlevel%
:answer1
echo Program had return code 1
:answer0
echo Program had return code 0
goto end
:end
echo Done!

現在はPowerShellやPowerShell Core、またはさまざまな多機能で便利なプログラミング言語が利用しやすい状況にあることから、バッチファイルを書いて多様な処理を行う必要性は低いといえる。そもそもバッチファイルでは制御構文を使った複雑な実装はやりにくいので、ある程度処理が複雑になってきたらほかの選択肢を選ぶだろう。

しかし、ifコマンドを知っておけば、コマンドプロンプトやバッチファイルでもある程度の分岐処理を行うことができる。Windowsコマンドを活用していくならぜひとも知っておきたい機能だ。

参考資料

※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。

一覧はこちら

連載目次

もっと知りたい!こちらもオススメ

【連載】RPA入門 - ツールで学ぶ活用シーン

【連載】RPA入門 - ツールで学ぶ活用シーン

AIには、ルールベース、機械学習、深層学習(ディープラーニング)の3つのレベルがあり、レベルが上がるに連れてより高度な人工知能を実現しますが、AIのスピンオフという位置付けで、Digital Labor(仮想知的労働者)によるホワイトカラー業務の自動化を実現するRPAが注目されています。

関連リンク

この記事に興味を持ったら"いいね!"を Click
Facebook で IT Search+ の人気記事をお届けします

会員登録(無料)

注目の特集/連載
[解説動画] Googleアナリティクス分析&活用講座 - Webサイト改善の正しい考え方
[解説動画] 個人の業務効率化術 - 短時間集中はこうして作る
ミッションステートメント
教えてカナコさん! これならわかるAI入門
知りたい! カナコさん 皆で話そうAIのコト
対話システムをつくろう! Python超入門
Kubernetes入門
AWSで作るクラウドネイティブアプリケーションの基本
PowerShell Core入門
徹底研究! ハイブリッドクラウド
マイナビニュース スペシャルセミナー 講演レポート/当日講演資料 まとめ
セキュリティアワード特設ページ

一覧はこちら

今注目のIT用語の意味を事典でチェック!

一覧はこちら

ページの先頭に戻る