バッチファイルとは
複数のコマンド処理を一つのファイルにまとめ、記述したコマンドを上から順に実行させるファイルのこと。ファイルの拡張子は.bat。
バッチファイルの作成方法
テキストファイルを作成し拡張子をbatに変更します。エディタでそのファイルを開き以下のコードを入力してください。
@echo off echo HELLO WORLD pause
作成したバッチファイルをダブルクリックで実行します。
コマンドプロンプトの画面にHELLO WORLDと表示されれば成功です。
プログラム解説
@echo off
一番初めに記載します。echoをオフにすると不要な実行コマンドが表示されなくなり画面が見やすくなります。
echo
設定した任意の文字列を表示するコマンドです。
echo [表示したい文字列]
pause
実行を一時停止されるコマンドです。
rem
バッチファイル内にコメントを記述することができるコマンドです。
コメントの部分にそのほかのコマンドを記述しても実行されることはありません
rem [コメント]
@echo off rem echoコマンド echo HELLO WORLD rem echo 実行されない pause
変数
変数はメモリに文字列などの値を保存するために使います。使い方は変数の名前を決めて、そこに保存する値を記述します。値を取り出したいときは%変数名%で取り出せます。変数はプログラムミングになくてはならないものです。使いこなせるようにしましょう。
batではsetコマンドを使って変数を設定します。
set 変数名=値
@echo off rem 変数名aに「HELLO WORLD」(値)を保存 set a=HELLO WORLD rem 変数から値を取り出し echo %a% pause
setのオプション
オプションとは通常のコマンドの処理になにか機能追加するためのものです。
/a オプション
文字列ではなく数字の加算時に使われます。
@echo off set a=1 set /a a+=1 echo %a% pause
結果 2
/p オプション
メッセージ付きでユーザーから標準入力を受け付けます。任意の入力を受け付ける場合時によく使用します。
@echo off :NAME_SET cls ECHO +-------------------------------------------------------+ ECHO 名前を入力してください。 ECHO +-------------------------------------------------------+ SET /P NAME=">>" if "%NAME%" == "" ( echo 名前を入力してください。 pause goto :NAME_SET ) else ( echo あなたのお名前は %NAME% です。 ) pause
環境変数
初めからWindowsで設定されている変数のことです。例えばパソコンやユーザーごとで変わってしまうフォルダを参照する場合などで使われます。
よく使う環境変数
・カレントディレクトリ %~dp0 ・ユーザープロファイル %USERPROFILE% ・コンピュータ名 %computername%
@echo off echo カレントディレクトリ:%~dp0 echo ユーザープロファイル:%USERPROFILE% pause
制御
バッチは上から順にコマンドを実行していくプログラムです。しかしこれだけでは簡単なものしか作成することができません。これをさらに複雑なものを作成するためにはプログラムにいろいろな流れを与え制御する必要があります。これを実現する方法にはif文を使った条件分岐とforを使った反復、サブルーチン、gotoを使った位置移動などがあります。
if文を使った条件分岐
条件を設定し条件に合格した場合はこの制御、不合格の場合はこの制御、といった場合に使用します。
if使い方
if 条件文 ( 合格した場合の制御内容 )
elseif使い方
if 条件文 ( 合格した場合の制御内容 ) else ( 不合格した場合の制御内容 )
一行で書く場合
if 条件 合格した場合の制御内容 else 不合格した場合の制御内容
条件文の書き方
AとBが正しい場合
if A == B ( )
AとBが正しく無い場合
if not A == B ( )
数値比較
[数値1]と[数値2]が等しい
if [数値1] equ [数値2] ( )
[数値1]と[数値2]が等しくない
if [数値1] neq [数値2] ( )
[数値1]が[数値2]より小さい
if [数値1] lss [数値2] ( )
[数値1]が[数値2]以下
if [数値1] leq [数値2] ( )
[数値1]が[数値2]より大きい
if [数値1] gtr [数値2] ( )
[数値1]が[数値2]以上
if [数値1] geq [数値2] ( )
ファイルの有無
IF EXIST ファイル名 ( )
空判定
入力されたかどうか判定するときによく使います。
@echo off set no= if "%no%" == "" ( echo 空 ) else ( echo 空ではない ) pause
結果 空
※変数にダブルクォーテーションを囲わないと変数の未定義エラーになる。
文字列比較
入力した文字をチェックするときなどに使います。
@echo off set str=テスト if "%str%" == "テスト" ( echo 【○】%str% ) else ( echo 【×】%str% ) pause
結果 【○】テスト
否定
@echo off set str=テスト if not "%str%" == "テスト" ( echo 【○】%str% ) else ( echo 【×】%str% ) pause
結果 【×】テスト
ファイルの有無
ファイルが存在するかどうかのチェックで使います。
@echo off set FILE=test.bat IF EXIST "%FILE%" ( echo %FILE%は存在する。 ) else ( echo %FILE%は存在しない。 ) pause
結果 test.batは存在する。
数値比較
@echo off set a=1 set b=2 set c=1 set d=3 if %a% equ %c% echo %a%と%c%は等しい。 if %a% neq %b% echo %a%と%b%は等しくない。 if %a% lss %b% echo %a%は%b%より小さい。 if %a% leq %b% echo %a%は%b%以下。 if %d% gtr %b% echo %d%は%b%より大きい。 if %d% geq %b% echo %d%は%b%以上。 pause
結果
1と1は等しい。 1と2は等しくない。 1は2より小さい。 1は2以下。 3は2より大きい。 3は2以上。
反復・繰り返し制御
プログラムでは反復制御をよく使われます。同じことを繰り返すことは人間には難しいですが、機械は簡単にこなします。起動している間ずっと同じことをやり続けさせることもできるため自動化には欠かすことが出来ない制御です。batではファイルの中身を一行つづ取り出すときやファイルやフォルダを検索するときにこの処理をよく使います。
forを繰り返し制御
・基本型 下記が基本型になります。順を追って説明します。 FOR オプション %%アルファベット1文字 in (ループ処理の対象) do ( ) ・オプション オプションとは通常のコマンドの処理になにか機能追加するためのものです。これによりより細かいコマンドの処理を要求することができます。forにもありオプションを使うことでいろいろな制御が可能です。 (オプション無し) ディレクトリ内を対象にとる /d ディレクトリ(フォルダ)名を対象にとる /r ディレクトリ名及びそのサブディレクトリ内(そのフォルダの中のファイル名やフォルダ名)を対象にとる /l 値を指定して代入する /f テキストファイル内の文章に対してトークンを取り出して代入する ・%%アルファベット1文字 オプションが決定した処理の対象を変数に代入します。forのみ使用できる特別な変数になります。 ※大文字と小文字は別物として判断 ※変数はfor文の中でだけ有効 ・ループ処理の対象 何回繰り返すかの場合は数字、フォルダやファイルの検索結果を対象にする場合はファイル名、テキスト内容やコマンドの出力結果を一行づつ取り出す場合はファイル名・コマンドなどがここに入ります。よってオプションによって内容が変わります。
指定した値まで繰り返す
ほかのプログラムでも良く使う処理です。オプション/lを使用します。
for /l %%アルファベット1文字 in (開始値、増加値、終了値) do ( %%アルファベット1文字には繰り返され増加されている値が入る )
0から10まで繰り返し
@echo off for /l %%i in (0,1,10) do echo %%i pause
ファイル検索
ここからbat特有の処理になります。フォルダ内からファイルやフォルダ名を検索するときにfor文を使います。フォルダ内のファイル名を一つ一つ調べていくため繰り返し処理が利用されています。
以下はデスクトップ内にある拡張子.batのファイルをすべてlog.txtに出力するプログラムです。ファイル名を対象にしますのでオプション/rを使用します。またフォルダ名のみ対象の場合はオプション/dを使用します。
for /r %%アルファベット1文字 in (検索対象) do ( %%アルファベット1文字には検索対象のファイル名が入る )
@echo off cd %USERPROFILE%\Desktop for /r %%A in (*.bat) do ( if exist "%%A" ( echo %%A >> log.txt ) ) pause
テキスト内の文章やコマンドの出力結果
コマンドの出力結果もfor文を使って一行づつ取り出しすことができます。コマンドを対象にしますのでオプション/Fを使用します。
FOR /F "トークンオプション" %%アルファベット1文字 in (ファイル名/'コマンド') do ( テキストファイル内の文章に対してトークンを取り出して代入 ) ・トークン(列番号) for文で一行づつ文章を取り出します。文章には一行内にいろいろな意味を持たせるため列の概念を持っています。そのためどの列の値を取り出したいか指定するためトークンというオプションが利用できます。 name age address tel tanaka 25 osaka 00-0000-0000 nakamura 26 nara 00-0000-0000 ・トークンオプション一覧 tokens= 何番目のトークンを指定するか? delims= トークンの区切り文字を指定(指定が無い場合はスペース) eol= この文字から始まる行を無視 skip= 先頭から指定された行数、スキップする。データにタイトルなどある場合に使う。
テキスト内の文章から特定の列を取り出す。
@echo off rem 検索用ファイルを作成 echo name age address tel > test.txt echo tanaka 25 osaka 11-0000-0000 >> test.txt echo nakamura 26 nara 22-0000-0000 >> test.txt echo ito 27 kyoto 33-0000-0000 >> test.txt FOR /F "tokens=2 skip=1" %%a in (test.txt) do ( echo %%a ) pause
コマンドの出力結果から特定の列を取り出す。
@echo off FOR /F "tokens=2 skip=2 eol=-" %%a in ('net user') do ( echo %%b ) pause
2行目の値を取得する場合
2つ以上のトークンを指定したとき、2つ目以降のトークンは定義したアルファベットの次の文字に代入される。
@echo off FOR /F "usebackq tokens=1,2 skip=2 eol=-" %%a in ('net user') do ( if not "%%b" == "" echo %%b ) pause
%%aが定義されているので2列目の値は%%bに代入される。 %%a 1列目 %%b 2列目 %%c 3列目
その他のトークンの指定例
・全ての列 tokens=* ・2列目とそれ以降すべて tokens=2,*
setlocal enabledelayedexpansion
変数を定義した後にif,for文などのカッコ内に定義した変数の値を変更しても初めに定義した値から書き換わらない現象に対応するために遅延環境変数を使う。遅延環境変数を使うためにこの一文を追加する必要がある。そして変数は%で囲うのではなく!で囲う。
遅延環境変数を使わない場合
@echo off set a=1 echo %a% if 1 == 1 ( set /a a+=1 echo %a% ) pause
結果 1 1
遅延環境変数使った場合
@echo off setlocal enabledelayedexpansion set a=1 echo %a% if 1 == 1 ( set /a a+=1 echo !a! ) pause
結果 1 2
位置移動
goto
指定したラベルの位置に処理を移動させます。
・基本型 GOTO ラベル名 :ラベル名
@echo off set a=0 :start echo 処理開始 goto :work :work echo 処理中 set /a a+=1 goto :end :end echo %a%:処理終了 if %a% == 10 ( goto :exit ) goto :start :exit echo 処理数が10に到達したので処理を終了 pause
サブルーチン
サブルーチンとは中核の処理とは別にほかの処理から呼び出されて処理を行うプログラムのことをいいます。batではcallがそれにあたります。gotoのようにラベルを設定しcallでラベルに移動します。gotoでは移動後もとの位置には戻りませんが、callは元の位置に戻ります。サブルーチンは引数を持っていて呼び出しもとの処理から値を受け取ることができます。受け取った値を処理して元の処理に渡すこともできます。ほかのプログラムの関数のように使用することができます。
@echo off set /P a="数字を入力してください>>" call :sub %a% echo %a% pause rem サブルーチン :sub rem 受け取った値に100足す set /a a=%1+100 rem 処理した値を返す exit /b %a%
・call batの実行、サブルーチンの実行 ・exitとexit /b exit 処理を止めて終了させる ・exit /b 戻り値 サブルーチンに引数を渡す
バッチの基本制御はここまで。
次回はリダイレクト、パイプ、文字列の操作、ファイルの操作、よく使うコマンドなどをまとめていきます。
「クラウドテック」です。 掲載案件では平均月60万、週3~4日勤務の案件が豊富で生活スタイルに合わせた働き方を設計できます。 また福利厚生が充実し旅行、レジャー、家事代行、ヘビーシッター、健康診断など100種類以上を無料で使えます。
- 97%がリモートのお仕事
- 週4日、週3日OKのお仕事多数
- 登録社数74万件業界トップクラス
- 2〜4週間程度でお仕事決定