バッチファイル

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動
BAT
拡張子.bat, .cmd (Windows NT)
種別スクリプト言語

バッチファイル: batch file)とは、MS-DOSOS/2Windowsでのコマンドプロンプトシェル)に実行させたい命令列をテキストファイルに記述したもの。バッチファイルを実行すると、シェルプログラム(一般にCOMMAND.COMcmd.exe)がそのファイルを読み、その中のコマンドを(通常)一行ずつ実行する。バッチファイルはUNIXオペレーティングシステムシェルスクリプトに相当する。

DOSのバッチファイルの拡張子.BATである。他の環境のバッチファイルの拡張子は様々である。例えば、Windows NTOS/2では.CMD が使われており、4DOS英語版 というフリーウェアでは .BTM が使われている。

AUTOEXEC.BATブート処理の中で実行される特別なバッチファイル(自動実行バッチファイル)である。

歴史[編集]

マイクロソフトのDOSとWindowsのバッチプログラミングはこれらのオペレーティングシステム (OS) 製品のリリースとともに発展してきた。これらOSに付属するコマンドインタプリタは2つの動作モードを持つ。一つは対話モード(コマンドプロンプトに従ってユーザーがコマンドを入力すると即座に実行される)とバッチモード(予め設定されたコマンド列を実行する)である。どちらのモードもUNIXのシェルや1980年代初期のCP/Mなどのコマンドインターフェイスがその考え方のベースとなっている。

MS-DOSオペレーティングシステムのバッチプログラム用インタプリタはCOMMAND.COMである。MS-DOS用バッチプログラムのうち比較的単純なコマンドはCOMMAND.COM自身が処理し(内部コマンド)、複雑なものは別の実行ファイルを呼び出して処理する(外部コマンド)。この系統のバッチプログラミングはMS-DOSからWindows 95Windows 98Windows MeWindows 9x系)まで発展していった。

Windows 2000およびWindows XP以降はMS-DOSではなくWindows NTに基づいている。この系統(Windows NT系)ではcmd.exeというコマンド行インタプリタが使われ、COMMAND.COMとはある程度の互換性がある。MS-DOSのいくつかの機能が削除されているが、MS-DOSやMS-DOSベースのWindowsにはない新たな機能も多く追加されている。互換性維持のためCOMMAND.COMも未だに搭載されている。

2006年には.NET Frameworkを基盤に動作する、モダンなオブジェクト指向のシェル環境としてWindows PowerShellがリリースされた。Windows PowerShellではdirなどの従来のWindowsコマンドに対するエイリアスが用意されており、完全ではないがある程度の互換性がある。PowerShellはWindows以外の環境にも.NET Coreベースで移植されている。

代表的なコマンド[編集]

echo[編集]

echoコマンドは標準出力にメッセージを表示する。メッセージ文字列をダブルクォーテーションやシングルクォーテーションなどで囲む必要はない。

また、echo onおよびecho offでコマンドエコーのON/OFFを切り替えることができる。コマンドエコーは既定でONになっており、各コマンド行を実行する前に標準出力にその内容を表示する[1]。この動作は通常必要とされないので、echo off コマンドをバッチファイルの最初に記述してそれを防ぐ。しかし、そのままでは echo off コマンド自体は表示されてしまう。単価記号 @ をコマンド行の先頭に置くと、その行は表示されないようになっているので、多くのバッチファイルには @echo off という行が先頭にある。

rem[編集]

コメント行はremで始める。remもコマンドの一種である[2]

cls[編集]

テキスト画面を削除する。

call[編集]

別のバッチファイルやラベルで指定したプログラムに処理を移す。バッチファイルにはローカル変数とグローバル変数の概念があり、サブルーチンの中でメインルーチンにある変数と同じ名前の変数を使っても区別される。

for[3][編集]

他の多くのプログラミング言語と同じように指定した回数ループすることができるコマンドであるが、それのみならずフォルダ内のすべてのファイルを確認しそれらのファイルに対して処理を行うなどと行ったこともできる。基本的には、

for (オプション) %%変数名 in (ループの対象) do(コマンド)

という書式になる。オプションとして何も指定しない場合はinで指定したディレクトリの中のファイル名1つを%%のあとに指定したアルファベット一文字の変数に代入してからdoの中の処理を行う。ファイルが無くなったら中断する。つまりファイルがなくならないようなプログラムを作ってしまうと無限ループになる。/rをオプションに指定すると、サブディレクトリまでも対象にする。

オプションとして/dを指定すると、inで指定したディレクトリの中のディレクトリ名が1つ変数に代入されてから、doの中の処理を行う。

/lは一般的なプログラミング言語における指定した回数のループを行う。その場合の書式は次のようになる。

for /l %%変数 in (開始値、増分、終了値) do コマンド

まず開始値で指定した数値が変数に代入され、doの中の処理が行われる。doの中の処理が終わると、変数の値が増分値で指定した分だけ増加し、またdo内の処理が行われる。変数の値が終了値に達すると処理が終了する。

[編集]

  • 単純なバッチファイルの例:
@echo off
cls
echo.
echo Hello World, press any key to start AProgram.exe!
pause > nul
AProgram.exe
echo.
echo AProgram has finished whatever it was doing. Have fun today!
@echo off
echo Hello world!!
pause > nul
3の倍数ならFizz、5の倍数ならBuzz、15の倍数ならFizz Buzzと表示し、FizzBuzz.txt に結果を出力
@echo off
setlocal enabledelayedexpansion
cd /d %~dp0
if exist %cd%\FizzBuzz.txt del %cd%\FizzBuzz.txt
for /l %%i in (1,1,100) do (
set echo=
set /a f=%%i%%3,b=%%i%%5
if !f!==0 set echo=!echo!Fizz
if !b!==0 set echo=!echo!Buzz
if "!echo!"=="" set echo=%%i
echo !echo!>>%cd%\FizzBuzz.txt
)
  • FFmpegでエンコード バッチファイルの置かれたディレクトリを終了するまで10秒おきに監視して、tsファイルを発見次第バッチファイルと同じフォルダに置かれたffmpeg.exeでmp4にエンコードしたあと、元のファイルを削除する。 エンコードされたファイルが既に存在する場合は上書きする。
    echo off
    cd %~dp
    :loop
    for %%i in (*.ts) do (
     call :encode %%i%
    )
    timeout 10
    goto :loop
    
    :encode
    ffmpeg.exe -i "%1" -vf bwdif=1 -c:v libx264 -c:a copy -bsf:a aac_adtstoasc ^
    -preset fast -aspect 16:9 -b:v 5500k -y "%~n1.mp4"
    del %1
    exit /b
    
    まず、forループでファイルが有るかどうかチェックする。見つかったファイルは:encodeというサブルーチンに渡される。これはエンコード後のファイル名をつける際の%~n1で元のファイルのファイル名だけを抽出する必要があるからだ。 encodeの中でファイルをffmpegに渡してエンコードし、その後delコマンドでファイルを削除したら、サブルーチンが終了し、メインルーチンに戻る。tsファイルがまだ残っていれば再びエンコードする。なければforループから抜け出し、10秒間待機する。再びtsファイルを発見すると順次エンコードする。

互換コマンドインタプリタ[編集]

マイクロソフト以外が提供するコマンドインタプリタにも様々なコマンドインタプリタがあり、強化された機能を提供している。4DOS英語版 はその一例である。

バッチプログラムを実行ファイルに変換するコンパイラもマイクロソフト以外からいくつか登場しているが、その品質は様々である。

IBMのOS/2オペレーティングシステムもマイクロソフトのOSと似たようなテキストベースのコマンド機能を持っている。

脚注[編集]

関連項目[編集]

外部リンク[編集]