本章では、「ラベル」について解説していきます。
今までのプログラムは書いたコードを上から順に実行していくプログラムでした。「ラベル」という機能を用いると、自由に実行する行を移動することができます。
この機能を使って処理をまとめて一つにすることでコードをスッキリとまとめることができたり、同じような処理を何度も書かなくてよくなる「関数化」という概念を導入できます。
その他の関連しそうな記事
ラベルを使って実行する行を移動する
以下のコードを記述したバッチファイル「label_test_1.bat」を作成して下さい。
1 2 3 4 5 6 7 8 9 |
@echo off goto :label echo 呼び出されない :label echo 呼び出される |
3行目の「goto」が指定した行に飛ぶコマンドです。「goto」の後に、飛ばす先を指定します。ここでは「:label」を指定していますが、これが「ラベル」です。すなわち7行目の「:label」ラベルに移動します。
移動後は通常通りそこから下のコマンドが順に実行されます。よって、5行目の「echo 呼び出されない」の行は実行されないことになります。
実行してみましょう。
コマンドプロンプトには「呼び出される」のみ表示されて、「呼び出されない」は表示されないことが確認できたと思います。
ラベルの使いすぎに注意
では、このプログラムを編集して、「呼び出される」のあとに「呼び出されない」と出力するにはどうしたらよいでしょう。それは以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
@echo off goto :label :label2 echo 呼び出されない goto :end :label echo 呼び出される goto :label2 :end |
「呼び出される」を表示するまでは一緒ですが、その後に「goto :label2」で「echo 呼び出されない」の直前に戻ります。これだけだと、上から順にコマンドが実行されるので、再び「echo 呼び出される」が実行されてしまいます。なので、「呼び出されない」が表示されたあとは、「:goto :end」で行の最後まで飛んでプログラムを終了させます。
このプログラムは実行する行があちこちに飛んで複雑です。このように「goto」コマンドを多用することは、プログラムを非常に分かりにくくするので避けるべきです。
if文と併用する
goto文はよくif文と組み合わせて使われます。
以下のバッチファイル「make_or_del.bat」は、「file.txt」ファイルが存在すれば削除し「file2.txt」ファイルを新しく作る。なければ空の「file.txt」ファイルを作るというプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@echo off if exist file.txt ( goto :delmk ) else ( goto :makefile ) :delmk del file.txt type nul > file2.txt goto :eof :makefile type nul > file.txt |
ラベル「:eof」は特別です。飛ばす先の「:eof」ラベルを書かなくてもプログラムの最後まで無条件で飛んでくれます。
15行目や20行目の「type nul > file.txt」は空のファイルを作るときのコマンドで、
type nul > 空のファイル名
と書きます。
このプログラムは、
1 2 3 4 5 6 7 8 9 10 11 12 |
@echo off if exist file.txt ( del file.txt type nul > file2.txt ) else ( type nul > file.txt ) |
と書いたのと同じことですが、もしif文の( )中の処理が長くなると全体のプログラムの流れが分かりづらくなります。そんなときはgoto文を使うことで、分かりやすいプログラムを書くことができるようになります。
また、同じ処理を呼び出したいときは「goto :[ラベル名]」と書けばよく、同じプログラムを再び書く必要がないことも大きなメリットです。バッチファイル「make_or_del.bat」でいうと、「「file.txt」ファイルが存在すれば削除し「file2.txt」ファイルを新しく作る」操作をもう一度、どこかで書きたい場合、「goto :delmk」と書いて「:delmk」ラベルを呼び出すだけでよいのです。
このように処理をまとめておいて、いつでも呼び出せる状態にしておくことを「関数化する」と言います。
第10章 まとめ
本章ではgoto文で任意の行に飛べることを学びました。
ただし、「goto」の乱用には気をつけましょう。プログラムが複雑になり、分かりづらくなります。
goto文はif文とよく併用され、if文の( )内の処理が長くなるときにラベルを使うとプログラムをスッキリさせることができます。また、「関数化」によって同じ処理を行いたい場合はラベルを呼び出すだけでよくなります。
【入門講義 第10章のまとめ】
- その1 「go to」コマンドで任意の行へ移動する。
- その2 ラベルを使うことで、プログラムをスッキリできる
- その3 同じ処理はラベルを呼び出すだけでよい(関数化)
なにか不明な点やうまくいかない場合は、「お問い合わせフォーム」からお気軽にお問い合わせ下さい。
次章では、ファイル名を一括変換する方法を紹介します。