この記事の概要を簡単まとめ!
- バッチファイル作成の中級編
- cmdにも存在するプログラミングでお馴染みのコマンド
- そのコマンドの注意事項なども解説
- 解説を交えて実際に作る
- 1つのバッチファイルで複数の処理から1つを選択できる
- コマンドの意味を知れば使い方も分かる
前回はバッチファイル入門編として、cmdの設定と、非常に簡単なバッチファイルを作成し、それを実行するところまで行った。とはいえ、バッチファイルに記述したアプリケーションをcmdから呼び出して起動するだけの内容だったため、cmdが有する複雑なコマンドは全く使用していない。とはいえ、startコマンドは少々面倒なものであったが。
cmdは他のプログラミング言語が有する、変数、条件式、(無条件の)ジャンプ文、forループなどを扱うことができる。元々はMS-DOSのコマンドであるため、主流プログラミング言語であるC++やPython系と比較すると、そこまでの機能は有さない。しかし、これらのコマンドの意味と使い方を知れば、自分のPCが扱いやすくなることは確かである。
このシリーズはcmd/バッチファイルが全く分からない初心者が、抵抗なくcmd/バッチファイルを扱えるまでをレクチャーするため、少しずつ紹介することにしている。今回は条件式とジャンプ文、それを使ったバッチファイルを作成し実行することを紹介していく。
ひとっ飛びできる目次
cmdとバッチファイル 中級編
はじめに:初回記事の紹介
この記事はシリーズ化しているため、初回記事を読んだ上でこれを読んでいるものとしている。そのため、読んでいない人はこちらから入門編が読める。
MS-DOSのコマンドが使用できるcmd
cmd.exeは、MS-DOSのコマンドが使用できる。それはcmdのソースファイルとなるバッチファイルも同様であり、バッチファイルに記述して実行することが可能である。
cmdのコマンドは全てcmdで使用できるものだが、そのうちの一部のコマンドはバッチファイルの方が手入力より明らかに早く、そして明らかに分かりやすいのである。cmdはコマンドラインインタプリタであるため、1行ずつの入力になることも、手入力よりバッチファイルの方がいい要因となる。
もっとも、何か処理をさせたい場合、その流れをプログラミングで書くことが多い。それはバッチファイルでも例外ではないことを意味している。本質は同じものであると言えるだろう。
実際に使用するコマンドの解説
さて、本題に入る前に、今回実際に使うコマンドについて解説する。中級編では、変数、ユーザーからの文字入力、条件式[if文]、goto文を使用して、表示される複数のアプリケーションから1つを選び、それを起動するバッチファイルを作成する。その際に使用するコマンドを以下に記述し、その解説を行う。
なお、前回の入門編で解説した事項については、既に知っているものとして進行する。
cmd/バッチファイル:変数関係
変数は、どのプログラミング言語においても使用される、数値ないし文字列を格納するための「記憶領域」である。cmdでは変数宣言やローカル変数の開始/終了などができる。今回使用する変数の定義やコマンドは以下の通りである。
set(コマンド)
setコマンド単体では、現在の環境における環境変数の一覧の表示を行うコマンドである。変数をセットしたい場合、以下のように宣言する。
1 2 3 4 5 6 7 8 9 10 11 12 |
rem 変数の宣言 rem 宣言方法は set 変数名=値 の書式に従う。なお、値には文字列も代入可能 set test_value = 255 rem 変数の中身を見る場合、echo %[変数名]%を実行する echo %test_value% rem 実行結果は255 rem 変数の中身を消去したい場合、右辺に何も書かない set test_value= echo %test_value% rem 実行結果は%test_value%がそのまま表示される(変数の中身を参照しない) |
C言語やJavaといった言語と比較すると、変数宣言においてそれが数値型か文字(列)型かを変数の前に宣言する必要がなく1)C言語やJavaなどの主流のプログラミング言語では、変数の前にその変数がどのようなデータ型を扱うか指定しなくてはならない。intやdoubleといったものが整数型、charやstringといったものが文字(列)型となる。なお、宣言された型以外の値を変数に入れようとするとエラーが発生する約束がある。また、処理系の関係から初期化する必要もある。、代入したい値を右辺に記述するだけのため、非常に簡潔である。初期化の必要はない。また文字列の場合も、ダブルクォーテーションの必要がないうえ、それ自体も文字として認識される。ただし特殊文字を通常の文字列として変数に格納したい場合は必要である。
また、ループや条件式で1つの変数を使いまわしたいが、一度変数の中身を消去したいことがあるだろう。その場合、set [変数名]= で、右辺を空白にすることで中身を消すことができる。通常は代入すれば元々の値は消去されるが、動作の安全面から行っておくといい。なお、このコマンド実行後にecho %[変数名]% でその変数の中身を見ようとすると、%[変数名]%をそのまま返してしまう。
ちなみに、何の説明もなく本文中にremというコマンドを使用しているが、これはコメントアウトのコマンドであるため、cmdで使っても何も起こらない。バッチファイル中で説明を追加するときに使用する。
set /p
setコマンドは、/pオプションでユーザーの文字入力待ちに使用することができる。C言語におけるscanf();と同等の役割をするものとなる。/pオプションの場合でも、変数の初期化なしに直接変数にユーザーから入力された値が代入される。使用方法は以下の通りである。
1 2 3 4 5 6 7 |
rem set /p でユーザーが入力した値を変数に代入 rem 書式は set /p [変数名]=%[変数名]% である rem %[変数名]%の前には任意の文字列を記述できる set /p input_test=何か入力してください:%input_test% echo %input_test% rem 結果は入力した値 |
このオプションで、ユーザーに文字を入力させることができる。この場合のみ、右辺に左辺と同じ変数を%%で囲ったものを記述し、それよりも前の位置で任意の文字列を記述できる。無論この文字列はあってもなくても動作するが、ユーザーが入力するポイントであることを明示するために記述するに越したことはない。
なお、特殊文字を文字として使用したい場合(特に”>”)、右辺で変数以外をダブルクォーテーションで囲うことで使用できる。
setlocal ~ endlocal
setlocal ~ endlocalは、環境変数の設定とカレントディレクトリをバッチファイル中のみ有効にする、スイッチの1つである。所謂ローカル変数である。基本的にsetlocalとendlocalはセットで使用する。以下は使用例である。
1 2 3 4 5 6 7 8 9 10 11 |
rem setlocalとendlocalの例 rem setlocalは@echo offと同様に、コマンドの前に記述して実行する rem endlocalはバッチファイルが終了する直前に記述して実行する @echo off setlocal rem 後は同じようにコマンドを記述する endlocal exit /b 0 |
バッチファイルでは基本的に@echo offを最初に実行するため、その後にsetlocalを行うのが一般的である。その後は普通に記述すれば問題ない。そして、endlocalはバッチファイル終了直前に記述する。多くの場合、exit /b 02)cmdを終了するコマンド。バッチファイルの場合、exitではcmdも閉じてしまうため、exit /bとしてバッチファイルのみを終了するようにオプションを設定する必要がある。/bの後に数値を入れることができるが、大抵のバッチファイルでは正常終了を表す”0″を記述する。それ以外の値は条件分岐などによる異常終了のエラーの値として利用されることが多い。の直前に記述してローカル変数を終了する。
cmd/バッチファイル:条件式[if文]
条件式といえば、どの言語でもおそらく”if文”が最初に挙がることだろう。cmdにも存在し、使用することができる。バッチファイルでも複数条件を設定することができ、どの条件にも合わなかった場合の処理を行うif-else構成が可能となっている。
今回は先に解説したset /pの入力した値と、その値がどれに一致するかを判定し、それぞれの場合に異なった処理をする方法で使用する。以下はその方法での使用例である。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@echo off setlocal rem set /pとif-else文の条件分岐 set /p key_input="9を入力してください >"%key_input% rem if-else文開始。9とそれ以外が入力されたときの分岐と処理を行う。 if /i "%key_input%"=="9" ( echo 9が入力されました。 ) else ( echo 9以外が入力されました) rem /iオプションは大文字と小文字の区別をしないモード rem ""で囲うことで文字列として判定する rem ifと条件式の後、()とは必ず半角スペースで空ける。空けないと()を認識しない rem ()内は半角スペースはあってもなくても問題ない endlocal exit /b 0 |
if文は等号を使用したものは等しい(==)のみである。それ以外は比較演算子を3文字で指定3)基本ルールとして、左辺を基準に右辺を比較する。使用できる演算子は次の通りである。EQU:等しい NEQ:等しくない LSS:左辺より小さい(同値を含まない) LEQ:左辺以下(同値を含む) GTR:NISSAN左辺より大きい(同値を含まない) GEQ:左辺以上(同値含む) 参照:If – DOS コマンド一覧 – Programming Field 今回解説しなかった他の使い方も記述されている。する。数値比較は、環境変数Errorlevelの終了コードの比較で利用することが多い。この方法はバッチファイルで環境設定を行うプログラマーなどの仕事をしている人向けで、通常は使う機会は少ない。
また、ifの()内は、バッチファイルの特性上1行に1コマンドのみだが、1行に複数のコマンドを記述したい場合、コマンドの終わりに半角スペースの後&、さらに半角スペースで次のコマンドを記述する。または、()内なら有効なので、()を閉じず改行して次のコマンドを記述する。&記述は横に長くなって見づらくなるため、改行記述を使用する方が楽である。
cmd/バッチファイル:goto文
goto文は指定したラベルに強制的に移動するコマンドである。このコマンドは多くの場合if文と共に使用される。if文である条件に一致した場合、そのラベルまで移動するような使い方が多い。使用例を以下に示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
rem gotoコマンドの例。set /pとif文も使用する rem gotoでラベルの使い方は、コマンドではgoto [ラベル名] rem 移動先は:[ラベル名]と記述する @echo off setlocal rem 移動先のラベル名には文頭にコロン":"が必要 :loopPoint echo a:Chromeを起動 b:firefoxを起動 set input= set /p key_input="選択してください>"%key_input% if /i "%key_input%"=="a" ( start "" "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" goto exitProcess) if /i "%key_input%"=="b" ( start "" "C:\Program Files\Mozilla Firefox\firefox.exe" goto exitProcess)^ else ( goto loopPoint) rem ifとelseは1行中に存在しなくてはいけないので、特殊文字ハット"^"で1行扱いにしている :exitProcess endlocal exit /b 0 |
goto文は非常に単純で、注意することは移動先には文頭にコロンが必要なくらいである。if文である処理をした後、直下の処理は行わずに先に進むため、或いは特定の地点まで戻るために使用する。基本的に移動先はどこにでも置けるが、使いすぎによる処理の複雑化には注意する必要がある。
goto文は多くのプログラミングにおいて禁忌とされている命令の1つであるが、バッチファイルではこれを多用する機会が多いため、使いこなせるようにしておく必要がある。
今回使用するコマンドの解説は以上である。次項でこれらを使用した、選択肢から1つのアプリケーションを選択し起動するバッチファイルを作成し、実際に起動するまでを行う。
中級編:条件分岐と選択でアプリケーションを起動する
ここまで解説で長かったが、必要な説明は終えたので複数の選択肢の中から1つのアプリケーションを選択して起動するバッチファイルを作成する。作成方法は前回の記事を見てもらうとして、ソースコードを下記に示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@echo off setlocal echo; echo Choose a start program. echo 1: Chrome 2: iTunes 3: MS-Excel echo If you do nothing, type "c" and enter. :loopbackMain set input= set /p input="Choose numbers >"%input% if /i "%input%"=="1" ( start "" "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" goto batExit ) if /i "%input%"=="2" ( start "" "C:\Program Files\iTunes\iTunes.exe" goto batExit ) if /i "%input%"=="3" ( start "" "C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE" goto batExit ) if /i "%input%"=="c" ( goto cancelBat )^ else (goto loopbackMain) :cancelBat echo Choose cancel. goto batExit :batExit endlocal exit /b 0 |
今回も例として、Chrome, iTunes, MS-Excelの3つのうち1つを起動するか、3つとも起動せずにバッチファイルを終了するかを選択できるようにしている。また、指定された文字以外が入力された場合はもう一度選択させるように、指定された文字で、アプリケーション起動の場合起動後に終了処理へ、キャンセルの場合キャンセルした旨をechoで表示して、その後終了処理へ移動するようgoto文を設定している。実際に実行すると次のようになる。

ちょっとした解説
前回は使用しなかったため解説しなかったが、echoコマンドはecho.やecho;と記述することで空白行の出力を行う。ソースコードの3行目で使用しているが、これは見やすさのために改行を行っている。echoコマンドで文字を出力するとき、区切りや繋がって見辛いときに使用するといい。
このバッチファイル中では、goto文の移動先は8行目 :loopbackMain, 20行目 :cancelBat, 24行目 :batExit に設定している。11-18行目が1つのif-elseの塊であるため、そのうちのどれか1つでも該当すれば、それ以外の処理をしないようにする必要があるため、goto文でそこから抜けるようにしておく必要がある。
また、17-18行目はif-else構成となっている4)通常、改行してしまうとelseが認識されなくなる。ただし17行目の末尾に^を置いたことで、18行目もまとめて1つの行と認識する。したがって、if-else構成となる。が、バッチファイルの特性上、1行単位で認識する。このため11-16行目の各if文の一致時の処理で、最後にgoto文を記述しておかないと、条件に一致して処理をしても、18行目のelseに一致してしまい、8行目の:loopbackMainに戻ってしまう無限ループが完成する。したがって、各if文の最後にgoto文を置く必要がある。
以上が解説となる。今回のバッチファイルで、set /pとif文(if-else含む)とgoto文はセットで使用されることが多いため、それぞれの機能と役割を覚えておくと書きやすくなる、ということが言える。
1つのバッチファイルで複数の処理から1つを選択できる
今回は中級編として、set, if, gotoコマンドを使用した1つのバッチファイルで複数の処理のうち1つを選択し、実行するものを作成した。今回も例として特定のアプリケーションを選択または何もせずに終了する見本を作成したが、アプリケーションの部分は自分がよく使うものに書き換えていいし、選択肢を増やしてもいい。基本的に既に記述されているコードをコピーして書きかえれば、簡単に増やせる。
それは、ただ使うだけならコピペでも十分である。しかし、ここでは各コマンドの意味を解説しているため、それらコマンドの意味を少しずつだが、理解できると考えている。もし自分でバッチファイルを改良したくても、コマンドの意味を知らなければ、どうしたらいいかわからない、ということになるためである。
逆を返せば、コマンドの意味を知れば、使い方も分かるということである。とはいえ、いきなり一人で作れるものではない。少しずつ理解し、真似をするところから始めれば、自分専用のバッチファイルを作ることが可能になる。是非とも真似してもらいたいものである。
以上、CMDとバッチファイルの中級編 -分岐と選択- であった。それでは、次回の記事で会おう。
リンクス岐部(LINKS-KIBE) at 18:00 Apr. 26th, 2020
スポンサーリンク
脚注
本文へ1 | C言語やJavaなどの主流のプログラミング言語では、変数の前にその変数がどのようなデータ型を扱うか指定しなくてはならない。intやdoubleといったものが整数型、charやstringといったものが文字(列)型となる。なお、宣言された型以外の値を変数に入れようとするとエラーが発生する約束がある。また、処理系の関係から初期化する必要もある。 |
---|---|
本文へ2 | cmdを終了するコマンド。バッチファイルの場合、exitではcmdも閉じてしまうため、exit /bとしてバッチファイルのみを終了するようにオプションを設定する必要がある。/bの後に数値を入れることができるが、大抵のバッチファイルでは正常終了を表す”0″を記述する。それ以外の値は条件分岐などによる異常終了のエラーの値として利用されることが多い。 |
本文へ3 | 基本ルールとして、左辺を基準に右辺を比較する。使用できる演算子は次の通りである。EQU:等しい NEQ:等しくない LSS:左辺より小さい(同値を含まない) LEQ:左辺以下(同値を含む) GTR: |
本文へ4 | 通常、改行してしまうとelseが認識されなくなる。ただし17行目の末尾に^を置いたことで、18行目もまとめて1つの行と認識する。したがって、if-else構成となる。 |