初心者でもわかるwindowsバッチファイル作成の基本

バッチファイルとは

複数のコマンド処理を一つのファイルにまとめ、記述したコマンドを上から順に実行させるファイルのこと。ファイルの拡張子は.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 戻り値
サブルーチンに引数を渡す

バッチの基本制御はここまで。
次回はリダイレクト、パイプ、文字列の操作、ファイルの操作、よく使うコマンドなどをまとめていきます。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする