連載
» 2018年03月08日 05時00分 公開

Tech TIPS:【Windows 10対応】Windowsのバッチファイルの基本的な使い方 (4/4)

[打越浩幸,デジタルアドバンテージ]
前のページへ 1|2|3|4       

gotoとラベル、exit

 「goto <ラベル>」は指定したラベルへジャンプするコマンドで、ラベルは行頭の「:」(コロン)に続けて「ラベル名」を指定することで定義する(ラベルを定義している行には他のコマンドは記述せず、ラベル単独にすること)。また暗黙のラベルとして、バッチファイルの最後には「:eof」というラベルがあるものと想定されており(EOFはファイル終了、End Of Fileの略)、「goto :eof」とするとバッチファイルが終了する(「goto eof」ではなく「goto :eof」にしないとエラーになる。「help goto」参照)。

gotoの使用例 gotoの使用例
goto文で実行順序を変更したり、「goto :eof」で実行を終了させたりできる。

 バッチファイルは最後まで到達すると自動的に終了する。それ以外にも、上のように「goto :eof」で終了させてもよいし、他にも「exit」コマンドで終了させてもよい。

 exitの場合は、例えば「exit /b 1」のようにして「終了コード」を返させることもできる。終了コードは、通常はエラーなしだと0、エラーがある場合は何らかの状態を表す1以上のコードを返すのが普通である(詳細は「help exit」参照。/bを付けないと、呼び出したコマンドプロンプトも終了してしまうので注意)。

callによるバッチファイルの呼び出し

 バッチファイル中で他のバッチファイルを呼び出すと、信じ難いかもしれないが、デフォルトでは別のバッチファイルへ制御が移った後、そのまま戻ってこない(これは大昔のシステムとの互換性のため)。呼び出した先のバッチファイルが終了すると、最初に呼び出したバッチファイルもそのまま終了してしまう。

 次の画面は、直接呼び出す例である。

バッチの呼び出し(直接呼び出し) バッチの呼び出し(直接呼び出し)
バッチ中から直接他のバッチを呼び出すと、制御は戻ってこない。

 バッチBの終了後、バッチAへ戻ってきていない。

 次は、call文を使ってバッチファイルを呼び出してみる。

バッチの呼び出し(callによる呼び出し) バッチの呼び出し(callによる呼び出し)
callを使って他のバッチを呼び出すと、期待した通りに呼び出し元へ戻ってくる。

 今度はバッチAの残りの部分も実行されている。

バッチファイル内のcall呼び出し

 独立した外部のバッチファイルではなく、同じファイル内にcallで呼び出せるブロックを定義することもできる。関連する処理を1つのファイル内でまとめて管理できるので便利である。詳細は「help call」を参照のこと。

バッチ内のローカルなルーチンの定義 バッチ内のローカルなルーチンの定義
ファイルを分離しなくても、バッチファイル内にローカルなブロック(サブルーチン)を定義することもできる。各ブロックの最後は「exit /b」で終了すること。

for文による繰り返し処理

 コマンドプロンプトのfor文はさまざまな機能を持つ。指定した引数のリストを使って処理を繰り返したり、ファイルやフォルダの一覧を取得して処理したり、指定されたステップで数値を変更させながら(例:変数Iを1から100まで1ずつ増やしながら)繰り返したりできる。非常に機能が多いので、これについては今後別記事で紹介する。基本的な使い方については「help for」コマンドを参照していただきたい。

 なお1つだけ補足しておくと、コマンドラインで使う場合とバッチファイル中で使う場合では、for文の制御変数の記述方法が異なるので注意が必要である。例えば、コマンドラインでは「for %i in (*.*) do echo %i」とすればファイル名の一覧が表示される。しかしこれをバッチファイル中へ組み込む場合は「%」を重複させて、「for %%i in (*.*) do echo %%i」のようにしなければならない。

インタラクティブな操作が必要なコマンドをバッチで利用する

 コマンドプロンプト上で利用するツールには、ユーザーによるインタラクティブな入力や操作が必要なものもある。そのようなコマンドであっても、例えば自動応答ファイルなどを作成して与えれば、バッチファイル中でも利用できることがある。

 例えばファイルなどのアクセス権を設定する「cacls.exe」というコマンドがある(これは現在では既に非推奨のコマンドとなっており、後継のicacls.exeなどの使用が推奨されている)。このコマンドでアクセス権を変更しようとすると、途中で「Y」というキーを入力しないと先へ進まないようになっている。だが次のTIPSで紹介しているように、「echo Y」コマンドで「Y」という文字を生成させ、それをパイプでcaclsコマンドに与えるとユーザーの介入なしに処理が完了する。

 コマンドによってはスクリプトファイルを受け付けるものもある(例:ftpやdiskpart、netshコマンドなど)。これらを使う場合、スクリプト中に環境依存の項目、例えばドライブ名や一時フォルダ、プロファイルフォルダの場所、日付や時刻、コンピュータ名、絶対パスなどを埋め込んでおかないと処理できないことがある。

 例えばdiskpartコマンドで仮想ディスクファイルを作成する場合、場所を絶対パスで指定しないといけない(TIPS「仮想ディスクをコマンドラインから作成・管理する」参照)。

 このような場合は、バッチファイル中でechoコマンドと環境変数、ファイルへのリダイレクトなどを組み合わせて動的にスクリプト用のテキストファイルを作成し(一時ファイルは%tmp%フォルダに作成する)、それをコマンドにスクリプトとして与える、という方法が利用できる。


 本TIPSでは、バッチファイルの基本的な作り方について簡単にまとめてみた。より進んだ使い方については、別TIPSで取り上げる。

■更新履歴

【2018/03/08】最新OSに合わせて内容を更新しました。

【2015/06/26】初版公開。


「Tech TIPS」のインデックス

Tech TIPS

前のページへ 1|2|3|4       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。