#はじめに
この投稿は、バッチファイルに触れてみたいと思った・触れてから日が浅い方向けのものです。
熟練のバッチファイラー(?)の方が見てもあまり意味はないと思います。
バッチファイルとは何ぞや?という説明はしませんので、バッチファイルの作り方だけは最低限マスターしてきてください。申し訳ありません。
あと、割と冗長で長いです。許してね。
#概略
- 1.hello,world! に学ぶ、文字の出力
- @echo offとは?
- echo
- pause
- >nul
- 2.クイズゲームに学ぶ、文字の入力と条件分岐
- cls
- choice
- if
- exit
- 3.変数の設定方法
- set
- Extra.問題
#1.hello,world! に学ぶ、文字の出力
まずは、これを見てください。
@echo off
echo Hello,world!
pause >nul
これの意味が完全に理解できる人は、次の章に進んで大丈夫です。
さて、どんなバッチファイルにも、大抵一行目に書いてある文があります。
@echo off
これですね。これが何かを説明するには、まずechoの説明が必要です。
echo は、『そのあとに続く文字を表示する』コマンドです。(それだけ。)
では、新しいメモ帳でこのプログラムをコピペして実行してください。
echo これがechoコマンドの力!
pause
さて、どうなったでしょうか?おそらく、
C:\Users\アカウント名\Desktop>echo これがechoコマンドの力!
これがechoコマンドの力!
C:\Users\アカウント名\Desktop>pause
続行するには何かキーを押してください . . .
となったと思います。
ですが、1,4行目にあるやつ、邪魔だと思いませんか?
それを消すのが、先述の@echo offというコマンドです。
このコマンドを入力しておくと、その行以降のコマンドの読み込み過程(1,4行目)が表示されなくなります。見た目がいいってことですね。
(ちなみに、@という文字は、echo offと同じ効果をその行にだけ付与します。echo offの前に@がついているのは、そうしないとecho offの行だけは邪魔なのが表示されるためです。)
では、先ほどのバッチファイルに@echo offをつけてみましょう。
Hello,world!
続行するには何かキーを押してください . . .
さっぱりですね。また、pauseには、名前通り『何かしらのキー入力があるまで動作をポーズ(停止)する』という意味があります。
ここで、皆さんはこう思わなかったでしょうか。すなわち…
続行するには何かキーを押してください . . .
の一文が邪魔だ、と。
ここで登場するのが、>nul。これ単体では何の意味もありませんが、コマンドの後につけると『そのコマンドの出力を表示しない』という効果を発揮します。
つまり、pauseに>nulをつけると…?
Hello,world!
できました。美しいですね。ちなみに、echoする文章の後に>nulをつけると、文章も消えます。意味はまったくないです。
さて、この章の初めに載せたものをもう一度見てみましょう。
@echo off
echo Hello,world!
pause >nul
はい。これだけです。つまり…
@echo off ←さっぱりさせて
echo Hello,world! ←表示して
pause >nul ←止める
では、次に進みましょう。
#2.クイズゲームに学ぶ、文字の入力と条件分岐
さて。ここからは、少し事前知識がないと厳しいかもしれません。
具体的には、『変数』が何かを知っていないといけません。
詳しい説明はめんどくさいここでは省きますが、簡単に言うと
1.任意の名前の箱を作る。
2.その箱の中に数字や文章などを一つだけ入れる。
3.その箱のことを変数といいます。
数学とかで使うxやyを『変数』(バッチファイルでは、一文字である必要はありません)といい、それに代入する(x=5とか。)ことを『変数を定義する』といいます。
(厳密には数学の文字式とは別物ですが、まあだいたい一緒なのでモーマンタイです)
「わけがわからないよ…」という方は、ググってから戻ってきてください(申し訳ないです)。
では、章の題名にもある、クイズゲームのバッチファイルを見てみましょう。
@echo off
echo バッチファイルの拡張子は?
echo.
echo 1. bat
echo 2. txt
echo 3. c
echo 4. zip
choice /c 1234 /t 5 /d 2 /n /m "答え…"
if %errorlevel% equ 1 goto ok
cls
echo 不正解。正解は1番のbatです。
pause >nul
exit
:ok
cls
echo 正解。正解は1番のbatです。
pause >nul
exit
はい。長いですね。すいません。
まず、8行目(echo 4.zip)までは問題ないでしょう。ある人は一章へどうぞ。
一つだけ追加事項です。echo.とすると、文字のない行が出ます。要は改行です。改行しようと思ってechoとだけ打っても、おかしなことになるだけです。
9行目。なかなか強そうですね。
choice /c 1234 /t 5 /d 2 /n /m "答え…"
choiceは、名前の通り『選択肢の中から一つを選択する』コマンドです。そのあとについているのはオプションといいます。説明します。
/c 1234
選択肢を、1,2,3,4にします。という宣言。宣言しないとy,nの二つになります。
選択肢として使えるのは一文字ずつだけです。10,11,12といった選択肢は用意できません。
/t 5
時間切れになるまでの秒数を宣言。ここでは5秒。宣言しないと、入力されるまで待ち続けます。
/d 2
/tを使用したとき限定。/tを使った場合、これがないとエラーになります。
時間切れになった時選ばれる選択肢を宣言。ここでは2を選択。つまり5秒たつと不正解扱いになるということです。
/n
選択肢の一覧を表示しない、という宣言。宣言しないと、行の最後に [1,2,3,4]? がくっつく。ここでは予めechoしてあるので宣言しました。
/m "答え…"
実行してみればわかりやすいですが、選択肢を聞くときに表示する文章です。無くてもかまいません。
お疲れ様でした。まだまだ終わりません。次は、choiceでプレイヤーが選んだ選択肢はどうやってわかるの?ということについて。10行目をご覧ください。
if %errorlevel% == 1 goto ok
大体わかる方もいるかもしれませんが、結果は%errorlevel%というところに入ります。
%errorlevel%って何やねん、というそこのあなた。これが、先ほど軽く説明した『変数』です。
choiceコマンドでは、errorlevelという名前の変数にその選択肢の順番を入れます。
このバッチなら、1だと1、2だと2といった感じ。もし選択肢がabcdの四つだったとすると、aなら1、bなら2といった具合に返ってきます。
また、errorlevelの中を見たい場合には、それを%変数%と、%でくくる必要があります。
次に、10行目にあるもうひとつのコマンド、ifの説明をしましょう。
そんなに難しくはありません。もうひとつのコマンド、goto(さっきもう一つと言ったな、あれは嘘だ)と一緒に覚えましょう。
if %errorlevel% == 1 goto ok
もし errorlevelの中身 等しい 1 (ならば、) 行く :okという行に
見づらいですが、人語に翻訳するとこうなります。
ここでは、%errorlevel%が1ということは選択肢の1番を選んだということです(正解)。
つまり、『正解を選んだなら、:okという行に飛ぶ』というコマンドになります。
お察しでしょうが、gotoは『:から始まる同名の行に飛ぶ』というコマンドです。go_toではありません(間にスペースは有りません)。注意。
~~深呼吸タイム~~
もう少しです。頑張ってください。ここで、バッチファイルの下のほうを見直しましょう。
if %errorlevel% == 1 goto ok
cls
echo 不正解。正解は1番のbatです。
pause >nul
exit
:ok
cls
echo 正解。正解は1番のbatです。
pause >nul
exit
さて、ifの行で、『もし正解を選んだら、:okに飛ぶ』と言いました。つまり、それ以外ならそのまま続行ということです。
ですが、if以下の行と:ok以下の行は、コマンドだけ見ると同じであることがわかると思います。なので、片方に絞って解説をしていきます。
cls
echo 不正解。正解は1番のbatです。
pause >nul
exit
clsは、『画面をクリア(空に)する』という意味です。要は、問題文とかが消えます。
exitは、『この行でこのバッチファイルを終了する』という意味です。画面自体が消えます(右上の×を押したのと同じ)。
pause >nulは問題ないでしょう。(ある人は一章へ。)
さあ、解説は以上です。もう一度見直しましょう。
@echo off
echo バッチファイルの拡張子は?
echo.
echo 1. bat
echo 2. txt
echo 3. c
echo 4. zip
choice /c 1234 /t 5 /d 2 /n /m "答え…"
if %errorlevel% == 1 goto ok
cls
echo 不正解。正解は1番のbatです。
pause >nul
exit
:ok
cls
echo 正解。正解は1番のbatです。
pause >nul
exit
『四択のクイズを出して、正解か不正解か判定して表示する。』というバッチファイルでした。
わかっていただけたでしょうか。
#3.変数の設定方法
先ほどのchoiceコマンドでは、答えが自動で%errorlevel%に入りました。
では、自分で変数を作りたい場合はどうすればいいでしょうか。
こちらを実行してみてください。
@echo off
set a=10
set /a b=a+3
set /a c=a-3
set /a d=a*3
set /a e=a/3
set /a f=a%%3
echo %a%,%b%,%c%,%d%,%e%,%f%
set /p num=""
echo %num%
pause >nul
大体わかると思いますが、setが変数を設定する時のコマンドです(2行目)。
書き方は、set 変数名=内容です。変数名はアルファベットか数字だけ(数字から始まる名前にはできない)、基本的に内容に半角小カッコは入れてはいけません。
次、3~7行目ではなにやら計算っぽいことをしています。計算するときには**/a**をつけます。
式の中で変数を%%で囲う必要はありません。むしろ囲ってはいけません!
間違えている人が多いです。かなり。詳しくは少し後で説明します。
b,c,d,eの式はわかりやすいですね、それぞれ加減乗除です(数式のように掛け算の記号を省略することはできません、注意)。ですが、この中の除、つまり割り算にはある重大な欠点があります。
割り算では小数点以下は切り捨て
使えねぇ、と思ったでしょう。同感です。
つまりeの式(set /a e=a/3)では、10÷3=3となって、eには3が入ることになります。
次に、最後の計算。
set /a f=a%%3
これは、余りを求める式です。「なんで%がふたつ?」と思った方もいるでしょう。
その理由は、『変数を読み込むときに使う%と見分けがつかないから』です。
例えば、
echo 消費税は5%です
を実行すると、『消費税は5です』となってしまいます。これは、変数を囲むときの%と区別がつかないためです。そこで、
echo 消費税は5%%です
に変更すると、『消費税は5%です』と表示できます。そういうものだと覚えてください。set /a で%%となっていた理由もお分かりいただけたと思います。**また、これこそが、先ほど言った『式の中で変数を%%で囲う必要はありません。むしろ囲ってはいけません!』の理由でもあります。**分かりますよね。
それと、この計算ではカッコを使うこともできます。先ほど、変数の内容に半角小カッコは入れてはいけないと言った理由の一つです。
では、下のほうを見てみましょう。
echo %a%,%b%,%c%,%d%,%e%,%f%
set /p num=""
echo %num%
pause >nul
ちなみに、『echo %a%,%b%,%c%,%d%,%e%,%f%』の結果は、『10,13,7,30,3,1』となります。小学生並みの計算ですね。
/pを使うと、そのあとに設定した変数(ここではnum)の中に、人間が入力した好きな文字列を代入できます。二文字以上もOKです。先ほどのchoiceではできない二文字以上の入力待ちを作るとき(簡単なパスワードとか?)では、こちらを使います。=のあとにある""の意味は、choice /m"答え…"の""と同じです。ここでは何も入っていないので、何も表示されません。
あとは、表示してpause >nulするだけのbatです。
いくつか注意です。
まず、変数を囲わなくていいのは/aだけです。set g=aとしても、gに10が入ることはありません(aという一文字が入ります)
また、set /pで、空白やカッコを入れられると先述の通り困ったことになりかねません。特に空白を入れられると、ほぼ確実にバグります。気を付けましょう。
#おわりに
わかりづらい解説で申し訳ありませんでした。ですが、少なくともここで挙げた3つのバッチファイルの挙動が理解できればバッチで困ることはあまりないでしょう。
自分のバッチ能力(?)を試したければ、筆者が作った迷路のバッチ(Qiita内のページです)を見て、わかるかどうか試してみるといいでしょう(露骨な宣伝)。
今回は、あえてforというバッチ内でよく使われ、かつとても難しいコマンドを説明しませんでした。とても初心者がやるものではないからです。筆者も完全には理解しきれていないところがあります。どんなのかというと、
for /F "tokens=1,2,3,*" %%a in ("1 2 3 4 5") do echo %%a,%%b,%%c,%%d
こんなのです(これも簡単なほう。こわい)。ちなみに、実行結果は
1,2,3,4 5
です。避けては通れないほど使えるコマンドなので、いずれ覚えましょう。
もし、「バッチファイルがエラー出て動かない!」みたいなことになりましたら、解説していないものでもコメントしていただければお答え~~(出来たら)~~します。
さてさて、本当に終わりです。
最後まで読んでいただき、有難うございました。
不具合・感想などありましたら、是非コメントにて。
#Extra.問題
さっき終わりと言ったな、あれはうs簡単な問題です。
『クイズゲームのバッチファイル』を、紹介したコマンドのみを使用して、13行以下に短縮せよ。ただし、空白行は含まないものとする。
@echo off
echo バッチファイルの拡張子は?
echo.
echo 1. bat
echo 2. txt
echo 3. c
echo 4. zip
choice /c 1234 /t 5 /d 2 /n /m "答え…"
if %errorlevel% == 1 goto ok
cls
echo 不正解。正解は1番のbatです。
pause >nul
exit
:ok
cls
echo 正解。正解は1番のbatです。
pause >nul
exit
@echo off
echo バッチファイルの拡張子は?
echo.
echo 1. bat
echo 2. txt
echo 3. c
echo 4. zip
choice /c 1234 /t 5 /d 2 /n /m "答え…"
set ans=不正解
if %errorlevel% == 1 set ans=正解
cls
echo %ans%。正解は1番のbatです。
pause >nul
@echo off
echo バッチファイルの拡張子は?&echo.
echo 1. bat&echo 2. txt&echo 3. c&echo 4. zip
choice /c 1234 /t 5 /d 2 /n /m "答え…"
if %errorlevel% == 1 (set ans=正解) else (set ans=不正解)
cls&echo %ans%。正解は1番のbatです。&pause >nul