ここまでは、一つの決まった処理をするバッチファイルを作ってきました。ここではバッチファイルを使っているユーザーの指示で、行う処理を変更できるような対話的なバッチファイルを作っていきましょう。
そこで重要なコマンドが「if」です。日本語訳だと「もし~ならば」となりますが、その意味の通り「もしユーザーがこう支持したらこう処理する、もしこっちの支持がでたらこっちの処理を行う」という分岐処理をさせることができます。
その他の関連しそうな記事
「if」文を使ってみる
「第7章」フォルダの中に「if_test.bat」というバッチファイルを作ってください。その中に以下を記述します。
1 2 3 4 5 6 7 8 |
@echo off set me=wada set you=wada if %me%==%you% ( echo Your and my name are %me% ) |
このバッチファイルをコマンドプロンプトで実行してください。
以下のように表示されましたか?
はじめの3,4行目の「set」で変数「me」と「you」に文字列「wada」を代入しています。
そして、6行目の「if」を使って「me」と「you」を比較して、同じ場合にだけ( )の中を実行しています。
このように、「if」を使って二つの文字列が同じかどうかを判定したいときは「==」を使います。この判定のことを「条件判定」と呼びます。
1 2 3 |
if [文字列1]==[文字列2] ( [文字列が等しい場合に実行したい処理] ) |
「if_test.bat」で「set you=wada」を「set you=tanaka」と変更すると、今度は何も表示されません。これはif文の「%me%==%you%」を満たさなかったために、( )の中が実行されなかったからです。
「else」で処理を分岐させる
「if_test.bat」を発展させ、以下のように変更します。
1 2 3 4 5 6 7 8 9 10 |
@echo off set me=wada set you=tanaka if %me%==%you% ( echo Your and my name are %me% ) else ( echo Your and my name are not same ) |
変数「you」が「tanaka」の状態で、if文の続きでelse文というもの増やしました。8行目です。
これを実行すると今度は、「Your and my name are not same」と出力されるはずです。
このように、else以下の( )で囲まれた場所に、「if」で指定した条件に合わなかった場合の処理を記述できます。
1 2 3 4 5 |
if [文字列1]==[文字列2] ( [文字列が等しい場合に実行したい処理] ) else ( [文字列が異なる場合に実行したい処理] ) |
else文は何回でも使えます。「if_test.bat」をさらに発展させましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@echo off set me=wada set you=tanaka set him=wada if %me%==%you% ( echo Your and my name are %me%. ) else if %me%==%him% ( echo his and my name are %me%. ) else ( echo Your and his name are not same with me. ) |
このように「else if」を付け足していくことでいくらでも分岐を増やすことができます。
そして、最後の「else」で上で指定したどの条件にも一致しなかった場合に処理が行われます。
1 2 3 4 5 6 7 |
if [文字列1]==[文字列2] [文字列1と2が等しい場合に実行したい処理] ) else if [文字列3]==[文字列4] ( [文字列1と2が等しくない場合で、文字列3と4が等しい場合に実行したい処理] ) else ( [上で指定したどの条件にも一致しなかった場合に実行する処理] ) |
ユーザーの入力情報を受け取る
これでif文の基礎は十分です。次は、ユーザーの入力情報を受け取る方法を紹介します。
これは「set」コマンドにオプションに「/p」を付けるだけで実現できます。こんな感じです。
1 2 3 4 |
@echo off set /p user_input=なにか入力してください。 echo あなたは「%user_input%」と入力しましたね。 |
これをバッチファイルとして「user_input.bat」に保存し、実行してみてください。入力を求められるので、適当に言葉を入力しEnterを押します。
うまく出力されましたか?以下、実行例です。
「set」にオプション「/p」を使うと、イコールの右側に書いた文字列が画面に表示され、「user_input」に自分が入力した文字列が代入されます。
普通に「set」コマンドを使う場合とかなり変わった動きをするようになりますね。バッチファイルは「set」以外にもオプションによって動きが全く変わるコマンドがたくさんありますので注意が必要です。
入力を判断して処理を分岐させる
ここまでの知識を使って、ユーザーの入力した情報を判断して、処理を分岐させるバッチファイルを作ってみましょう。ここで作るのは以下のようなバッチファイルです。
【Step.1】
選択: ユーザーに1~3の入力を求めます。
【Step.2】
分岐1: 1が入力されると指定したファイルがコピーされます。
分岐2: 2が入力されると指定したファイルの名前が変わります。
分岐3: 3が入力されると指定したファイルが削除されます。
バッチファイルを「edit_file.bat」として作成します。処理の対象ファイルとして「file.txt」をバッチファイルと同じ場所に作ってください。
上記した処理をプログラムにすると、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@echo off echo *********************** echo 1. %1をコピー echo 2. %1の名を変更 echo 3. %1を削除 echo *********************** set /p ui=1~3を選択してください: if %ui%==1 ( copy %1 copy_%1 ) else if %ui%==2 ( rename %1 ren_%1 ) else if %ui%==3 ( if exist %1 del %1 ) else ( echo 1~3のどれかを選択してください。 ) |
これを「edit_file.bat」として保存します。
3~7行目の「echo」はユーザーに入力番号とそれに対応する処理を説明するものです。ここで、「%1」には引数が入り、コマンドプロンプト上で実行する際、処理の対象となるファイルを指定します。以下のような形で実行します。
1 |
edit_file.bat file.txt |
10行目からユーザーの入力番号に対して、それぞれの処理を書いています。ユーザーの入力番号は変数「ui」に格納されています。
「1」を入力した場合、11行目が実行されますが、対象ファイル名を「copy_ファイル名」としてコピーする処理です。
「2」を入力すると「rename」コマンドが実行されます。これは、ファイルの名前を変えるコマンドで、
1 |
rename 対象ファイル名 名前変更後のファイル名 |
というように使います。
この場合、「copy」コマンドはと違って、「file.txt」は「ren_file.txt」という名前に変えられてしまうため、「file.txt」という名のファイルは残りません。
「3」を入力した場合、「del」コマンドでファイルを消去します。
1 |
del 消したいファイル名 |
です。ここでは「del」コマンドの前に「if exist ファイル名(ここでは、%1)」がくっついています。
これは「もしファイルが存在すれば、それ以降のコマンドを実行する」というコマンドです。すなわち「file.txt」ファイルが存在する場合にだけ、その後に書かれたコマンドを実行します。
これを付けないと、「file.txt」というファイルが無い場合、「file.txtが見つかりませんでした。」という警告が出るため付けています。無くても問題ありませんが、警告が出るの嫌うときにはよく使う手法ですので、
1 |
if exist 存在を確かめたいファイル名 実行したいコマンド文 |
を一つの文型として覚えてしまいましょう。
このバッチファイルを自由にテストして、動きを確認してみましょう。
第7章のまとめ
本章では、ユーザーが処理を選択できるようにしました。
ユーザーからの入力は「set /p user_input=[画面出力文字]」で可能でした。ユーザーからの入力情報を受け取ると、「if文」で条件判定を行い分岐処理を行いました。
【入門講義 第7章のまとめ】
- その1 ユーザーからの入力は「set /p user_input=[画面出力文字]」で受け取ることができる。
- その2 「if文」で条件判断し、分岐処理を行う。
- その3 上記の二つを組み合わせると、ユーザー選択を可能にできる
なにか不明な点やうまくいかない場合は、「お問い合わせフォーム」からお気軽にお問い合わせ下さい。
次章では、バッチファイルの核とも言える「ループ処理」について学んでいきます。
あなた様のサイトでバッチの勉強をさせていただいています。
「1から3の入力番号で処理を分岐する」のプログラムで3を選択して「file.txt」が存在しなければ「echo 1~3のどれかを選択してください。」が表示されるのだろうと思うのですがされません。
掲載されているプログラムをそのままコピーしても同じです。
理由が分かるとありがたいのですが。
ご質問ありがとうございます。
>>「1から3の入力番号で処理を分岐する」のプログラムで3を選択して「file.txt」が存在しなければ「echo 1~3のどれかを選択してください。」が表示されるのだろうと思うのですがされません。
ですが、「file.txt」が存在しなければ「echo 1~3のどれかを選択してください。」が表示されるわけではございません。
「echo 1~3のどれかを選択してください。」が実行されるのは、入力を求められたときに1~3以外のキーを打ち込んだときです。
ファイルが存在しないときの処理はこのコードには書いていないのです。エラーが起きると思われます。
ファイルが存在しないときにどのような処理をしたいかを教えていただければ、何かアドバイスできるかもしれません。
よろしくお願いいたします。
おさらいをしていてご回答いただいていることに気づきました。
大変失礼いたしました。
チンプンカンプンの状態で始めたために変な質問をしたようです。
現在、ここで学んだ内容をもとにFTPサーバから自動でダウンロードしたり、バックアップを取ったりと色々楽しませていただいています。
ありがとうございました。