【bat中級編】分岐と選択でまとまるバッチファイルの作成 | Kibekin BLOG.

【bat中級編】分岐と選択でまとまるバッチファイルの作成

この記事の概要を簡単まとめ!

  • バッチファイル作成の中級編
  • cmdにも存在するプログラミングでお馴染みのコマンド
  • そのコマンドの注意事項なども解説
  • 解説を交えて実際に作る
  • 1つのバッチファイルで複数の処理から1つを選択できる
  • コマンドの意味を知れば使い方も分かる

前回はバッチファイル入門編として、cmdの設定と、非常に簡単なバッチファイルを作成し、それを実行するところまで行った。とはいえ、バッチファイルに記述したアプリケーションをcmdから呼び出して起動するだけの内容だったため、cmdが有する複雑なコマンドは全く使用していない。とはいえ、startコマンドは少々面倒なものであったが。

cmdは他のプログラミング言語が有する、変数、条件式、(無条件の)ジャンプ文、forループなどを扱うことができる。元々はMS-DOSのコマンドであるため、主流プログラミング言語であるC++やPython系と比較すると、そこまでの機能は有さない。しかし、これらのコマンドの意味と使い方を知れば、自分のPCが扱いやすくなることは確かである。

このシリーズはcmd/バッチファイルが全く分からない初心者が、抵抗なくcmd/バッチファイルを扱えるまでをレクチャーするため、少しずつ紹介することにしている。今回は条件式とジャンプ文、それを使ったバッチファイルを作成し実行することを紹介していく。

cmdとバッチファイル 中級編

はじめに:初回記事の紹介

この記事はシリーズ化しているため、初回記事を読んだ上でこれを読んでいるものとしている。そのため、読んでいない人はこちらから入門編が読める。

【コマンド入力】CMDとバッチファイルでショートカット 入門編

MS-DOSのコマンドが使用できるcmd

cmd.exeは、MS-DOSのコマンドが使用できる。それはcmdのソースファイルとなるバッチファイルも同様であり、バッチファイルに記述して実行することが可能である。

cmdのコマンドは全てcmdで使用できるものだが、そのうちの一部のコマンドはバッチファイルの方が手入力より明らかに早く、そして明らかに分かりやすいのである。cmdはコマンドラインインタプリタであるため、1行ずつの入力になることも、手入力よりバッチファイルの方がいい要因となる。

もっとも、何か処理をさせたい場合、その流れをプログラミングで書くことが多い。それはバッチファイルでも例外ではないことを意味している。本質は同じものであると言えるだろう。



実際に使用するコマンドの解説

さて、本題に入る前に、今回実際に使うコマンドについて解説する。中級編では、変数、ユーザーからの文字入力、条件式[if文]、goto文を使用して、表示される複数のアプリケーションから1つを選び、それを起動するバッチファイルを作成する。その際に使用するコマンドを以下に記述し、その解説を行う。

なお、前回の入門編で解説した事項については、既に知っているものとして進行する。

cmd/バッチファイル:変数関係

変数は、どのプログラミング言語においても使用される、数値ないし文字列を格納するための「記憶領域」である。cmdでは変数宣言やローカル変数の開始/終了などができる。今回使用する変数の定義やコマンドは以下の通りである。

set(コマンド)

setコマンド単体では、現在の環境における環境変数の一覧の表示を行うコマンドである。変数をセットしたい場合、以下のように宣言する。

C言語やJavaといった言語と比較すると、変数宣言においてそれが数値型か文字(列)型かを変数の前に宣言する必要がなく1)C言語やJavaなどの主流のプログラミング言語では、変数の前にその変数がどのようなデータ型を扱うか指定しなくてはならない。intやdoubleといったものが整数型、charやstringといったものが文字(列)型となる。なお、宣言された型以外の値を変数に入れようとするとエラーが発生する約束がある。また、処理系の関係から初期化する必要もある。代入したい値を右辺に記述するだけのため、非常に簡潔である。初期化の必要はない。また文字列の場合も、ダブルクォーテーションの必要がないうえ、それ自体も文字として認識される。ただし特殊文字を通常の文字列として変数に格納したい場合は必要である。



また、ループや条件式で1つの変数を使いまわしたいが、一度変数の中身を消去したいことがあるだろう。その場合、set [変数名]= で、右辺を空白にすることで中身を消すことができる。通常は代入すれば元々の値は消去されるが、動作の安全面から行っておくといい。なお、このコマンド実行後にecho %[変数名]% でその変数の中身を見ようとすると、%[変数名]%をそのまま返してしまう。

ちなみに、何の説明もなく本文中にremというコマンドを使用しているが、これはコメントアウトのコマンドであるため、cmdで使っても何も起こらない。バッチファイル中で説明を追加するときに使用する。

set /p

setコマンドは、/pオプションでユーザーの文字入力待ちに使用することができる。C言語におけるscanf();と同等の役割をするものとなる。/pオプションの場合でも、変数の初期化なしに直接変数にユーザーから入力された値が代入される。使用方法は以下の通りである。

このオプションで、ユーザーに文字を入力させることができる。この場合のみ、右辺に左辺と同じ変数を%%で囲ったものを記述し、それよりも前の位置で任意の文字列を記述できる。無論この文字列はあってもなくても動作するが、ユーザーが入力するポイントであることを明示するために記述するに越したことはない。

なお、特殊文字を文字として使用したい場合(特に”>”)、右辺で変数以外をダブルクォーテーションで囲うことで使用できる。

setlocal ~ endlocal

setlocal ~ endlocalは、環境変数の設定とカレントディレクトリをバッチファイル中のみ有効にする、スイッチの1つである。所謂ローカル変数である。基本的にsetlocalとendlocalはセットで使用する。以下は使用例である。

バッチファイルでは基本的に@echo offを最初に実行するため、その後にsetlocalを行うのが一般的である。その後は普通に記述すれば問題ない。そして、endlocalはバッチファイル終了直前に記述する。多くの場合、exit /b 02)cmdを終了するコマンド。バッチファイルの場合、exitではcmdも閉じてしまうため、exit /bとしてバッチファイルのみを終了するようにオプションを設定する必要がある。/bの後に数値を入れることができるが、大抵のバッチファイルでは正常終了を表す”0″を記述する。それ以外の値は条件分岐などによる異常終了のエラーの値として利用されることが多い。の直前に記述してローカル変数を終了する。




cmd/バッチファイル:条件式[if文]

条件式といえば、どの言語でもおそらく”if文”が最初に挙がることだろう。cmdにも存在し、使用することができる。バッチファイルでも複数条件を設定することができ、どの条件にも合わなかった場合の処理を行うif-else構成が可能となっている。

今回は先に解説したset /pの入力した値と、その値がどれに一致するかを判定し、それぞれの場合に異なった処理をする方法で使用する。以下はその方法での使用例である。

if文は等号を使用したものは等しい(==)のみである。それ以外は比較演算子を3文字で指定3)基本ルールとして、左辺を基準に右辺を比較する。使用できる演算子は次の通りである。EQU:等しい  NEQ:等しくない  LSS:左辺より小さい(同値を含まない)  LEQ:左辺以下(同値を含む)  GTR:NISSAN左辺より大きい(同値を含まない)  GEQ:左辺以上(同値含む)  参照:If – DOS コマンド一覧 – Programming Field  今回解説しなかった他の使い方も記述されている。する。数値比較は、環境変数Errorlevelの終了コードの比較で利用することが多い。この方法はバッチファイルで環境設定を行うプログラマーなどの仕事をしている人向けで、通常は使う機会は少ない。

また、ifの()内は、バッチファイルの特性上1行に1コマンドのみだが、1行に複数のコマンドを記述したい場合、コマンドの終わりに半角スペースの後&、さらに半角スペースで次のコマンドを記述する。または、()内なら有効なので、()を閉じず改行して次のコマンドを記述する。&記述は横に長くなって見づらくなるため、改行記述を使用する方が楽である。

cmd/バッチファイル:goto文

goto文は指定したラベルに強制的に移動するコマンドである。このコマンドは多くの場合if文と共に使用される。if文である条件に一致した場合、そのラベルまで移動するような使い方が多い。使用例を以下に示す。

goto文は非常に単純で、注意することは移動先には文頭にコロンが必要なくらいである。if文である処理をした後、直下の処理は行わずに先に進むため、或いは特定の地点まで戻るために使用する。基本的に移動先はどこにでも置けるが、使いすぎによる処理の複雑化には注意する必要がある。

goto文は多くのプログラミングにおいて禁忌とされている命令の1つであるが、バッチファイルではこれを多用する機会が多いため、使いこなせるようにしておく必要がある。

今回使用するコマンドの解説は以上である。次項でこれらを使用した、選択肢から1つのアプリケーションを選択し起動するバッチファイルを作成し、実際に起動するまでを行う。




中級編:条件分岐と選択でアプリケーションを起動する

ここまで解説で長かったが、必要な説明は終えたので複数の選択肢の中から1つのアプリケーションを選択して起動するバッチファイルを作成する。作成方法は前回の記事を見てもらうとして、ソースコードを下記に示す。

今回も例として、Chrome, iTunes, MS-Excelの3つのうち1つを起動するか、3つとも起動せずにバッチファイルを終了するかを選択できるようにしている。また、指定された文字以外が入力された場合はもう一度選択させるように、指定された文字で、アプリケーション起動の場合起動後に終了処理へ、キャンセルの場合キャンセルした旨をechoで表示して、その後終了処理へ移動するようgoto文を設定している。実際に実行すると次のようになる。

バッチファイル実行画像
test003_choose.batを実行した様子。表示以外を入力すればループ、キャンセルを入力すればキャンセル、いずれかのアプリケーションを選択すれば動作するようになっている。

ちょっとした解説

前回は使用しなかったため解説しなかったが、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:NISSAN左辺より大きい(同値を含まない)  GEQ:左辺以上(同値含む)  参照:If – DOS コマンド一覧 – Programming Field  今回解説しなかった他の使い方も記述されている。
本文へ4 通常、改行してしまうとelseが認識されなくなる。ただし17行目の末尾に^を置いたことで、18行目もまとめて1つの行と認識する。したがって、if-else構成となる。
KIBEKIN
会社員という働き方が合わないのに会社員になってしまってから、半ば自分からリタイア後ブログクリエイターとなり活動してきた社会不適合者。VRやVTuberに触れる機会が増え、今後はリスペクトだけではなく自分を作る意味を込め、VTuberならぬVBlogCreator"KIBEKIN"として新しいスタートを切る。


コメントを残す

メールアドレスが公開されることはありません。
名前は必須項目となります。記入をお願いいたします。

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

Ads Blocker Image Powered by Code Help Pro

広告ブロックを検知しました。 | Ad block detected.

ブラウザのアドオン、及びブラウザに内蔵されているアドブロック機能により、広告ブロックが行われていることが検知されました。
本ブログは広告収入により運営されており、広告ブロックは正当な理由の下で配信されている広告をも阻害することとなり、運営が非常に困難になります。
この表示は広告ブロック機能の無効化、あるいはホワイトリストへの追加を行った上で、更新を行うことで消すことができます。または、広告ブロック機能のないブラウザで閲覧ください。
広告で嫌な思いをしたことがあるとは思いますが、一律に広告をブロックすることで失われるコンテンツも存在します。そのことへのご理解とご協力をお願いします。

We have detected that ad-blocking is being performed by browser add-ons and the browser’s built-in ad-blocking function.
This blog is operated by advertising revenue, and ad blocking will interfere with advertisements that are also being served under legitimate reasons, making it very difficult to operate.
This display can be removed by disabling the ad-blocking function or adding it to the white list and then updating it. Alternatively, please view the site with a browser that does not have an ad-blocking function.
We understand that you may have had bad experiences with advertisements, but there are some contents that are lost by uniformly blocking advertisements. We ask for your understanding and cooperation in this matter.

Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock