バッチファイル(.bat)とは、Windowsのコマンドを1つのファイルにまとめて自動実行できる仕組みです。毎日のファイル整理・バックアップ・システム情報の記録など、繰り返し作業を一発で実行できるようになります。
この記事では、テキストエディタでのゼロからの作り方・基本コマンドの書き方・4通りの実行方法・実践例3本まで、初心者向けに完全解説します。
この記事でわかること:バッチファイルの作成手順 / 基本コマンド8選 / 変数・if・forの基本 / 実行方法4通り / ファイルバックアップなどの実践例
バッチファイルとは
バッチファイルとは、Windowsのコマンドを並べたテキストファイルに拡張子 .bat または .cmd を付けたものです。ダブルクリックするだけで、書いたコマンドが順番に実行されます。
| 特徴 | 内容 |
|---|---|
| 作成に必要なもの | テキストエディタ(メモ帳でもOK) |
| 実行環境 | Windows標準(追加インストール不要) |
| 拡張子 | .bat または .cmd |
| 実行方法 | ダブルクリック・コマンドプロンプト・タスクスケジューラなど |
| 主な用途 | ファイル操作・バックアップ・システム管理・自動化全般 |
バッチファイルの作り方(3ステップ)
ステップ1:テキストエディタを開く
バッチファイルはテキストエディタで作成します。Windowsに標準搭載のメモ帳(Notepad)で作れますが、VSCodeを使うとシンタックスハイライトが付いて見やすくなります。
| エディタ | 特徴 | 初心者向け |
|---|---|---|
| メモ帳(Notepad) | 追加インストール不要・Windows標準 | ◎ |
| VSCode | 構文ハイライト・エラー表示・便利 | ○ |
| サクラエディタ | 無料・軽量・日本語に強い | ○ |
ステップ2:コードを書く
以下のコードをコピーして貼り付けてみましょう。これがバッチファイルの基本形です。
@echo off echo Hello, World! echo バッチファイルが実行されました pause
コードの意味:
@echo off:コマンドの表示を抑制する(ほぼ全てのバッチファイルに書く)echo メッセージ:画面にテキストを表示するpause:「続行するには何かキーを押してください」と表示して一時停止する
ステップ3:.bat で保存する
メモ帳での保存手順:
- メモ帳で「ファイル」→「名前を付けて保存」を開く
- ファイル名を
"hello.bat"(ダブルクォートで囲む)と入力する - 「ファイルの種類」を「すべてのファイル」に変更する
- 文字コードを「ANSI」または「UTF-8(BOMなし)」に設定する
- 保存ボタンを押す
ファイル名のダブルクォートが重要:クォートなしで hello.bat と入力すると、メモ帳が自動的に .txt を付けて hello.bat.txt になる場合があります。
VSCodeでの保存手順:
- Ctrl+Shift+S(名前を付けて保存)でファイル名を
hello.batと入力して保存 - 右下の「CRLF」を確認(改行コードはCRLF)
- 文字コードは「UTF-8」または「Shift-JIS」を使用。BOM付きUTF-8は避ける
バッチファイルの実行方法(4通り)
1. ダブルクリックで実行
エクスプローラーで .bat ファイルをダブルクリックするだけで実行できます。最も手軽な方法です。
2. コマンドプロンプトから実行
cd でバッチファイルのあるフォルダに移動してから実行します。
:: コマンドプロンプト(cmd)での実行 cd C:\Users\user\Desktop hello.bat :: フルパスで実行 C:\Users\user\Desktop\hello.bat
3. 右クリック→「管理者として実行」
管理者権限が必要な処理(システム変更・サービス操作など)は右クリック→「管理者として実行」を選択します。
4. タスクスケジューラで自動実行
「タスクスケジューラ」に登録すると、指定した時刻や条件で自動実行できます。毎日夜中にバックアップを取るなどの用途に便利です。
基本コマンド8選
| コマンド | 用途 | 使用例 |
|---|---|---|
@echo off |
コマンドの表示を抑制 | ファイルの先頭に書く |
echo |
テキストを表示 | echo 処理完了 |
rem / :: |
コメント | :: 説明文 |
set |
変数の設定・参照 | set "NAME=値" |
if |
条件分岐 | if exist "file.txt" ... |
for |
繰り返し処理 | for %%F in (*.txt) do ... |
pause |
一時停止(キー待ち) | 確認後に閉じる用途 |
exit /b |
バッチを終了する | exit /b 0(正常終了) |
@echo off と echo の使い方
@echo off はバッチファイルのほぼ全てに書く定番の1行目です。これがないと実行するたびにコマンド名がそのまま表示されて見づらくなります。
@echo off の詳しい仕組みは「バッチファイルで@echo offを使いこなす完全ガイド」で解説しています。
@echo off :: @echo off: 以降のコマンドを画面に表示しない echo 処理を開始します echo ======================== echo バックアップツール v1.0 echo ======================== :: 空行を出力するときは echo. または echo(を使う echo. echo 準備完了 pause
コメントの書き方
バッチファイルでコメントを書くには ::(ダブルコロン)または rem を使います。
詳しくは「バッチファイルでコメントアウトする方法」も参照してください。
@echo off :: これはコメントです(:: を使う方法) rem これもコメントです(rem を使う方法) :: ブロックコメント風に使う :: ---------------------------------------- :: 処理内容: ファイルをバックアップする :: 作成日 : 2024-01-01 :: ---------------------------------------- echo 処理開始
変数の使い方(set・%変数%)
バッチファイルでは set コマンドで変数を設定し、%変数名% で値を参照します。
変数の詳細は「環境変数を設定・参照する方法|setと%変数%の使い方」を参照してください。
@echo off setlocal :: 変数の設定 set "NAME=山田太郎" set "AGE=30" set "FOLDER=C:\Work\backup" :: 変数の参照(%変数名%で囲む) echo 名前: %NAME% echo 年齢: %AGE% echo フォルダ: %FOLDER% endlocal
変数代入のベストプラクティス:set "NAME=値" のようにダブルクォートで囲むと、末尾のスペースが変数値に入り込むのを防げます。
if 文(条件分岐)の基本
if 文で「ファイルが存在するか」「変数の値が一致するか」などの条件分岐ができます。
@echo off
setlocal
:: ファイルが存在するか確認
set "TARGET=C:\data\report.txt"
if exist "%TARGET%" (
echo ファイルが存在します: %TARGET%
) else (
echo ファイルが見つかりません: %TARGET%
)
:: 文字列の比較
set "STATUS=OK"
if "%STATUS%"=="OK" (
echo 正常終了
) else (
echo 異常終了
)
endlocal
for 文(繰り返し処理)の基本
for 文でファイルのループ処理や数値カウンタを実装できます。
for文の詳細は「FOR文の使い方完全ガイド」を参照してください。
@echo off
setlocal
:: カレントフォルダのすべての .txt ファイルを処理
for %%F in (*.txt) do (
echo 処理中: %%F
)
:: 数値ループ(1〜5を繰り返す)
for /l %%I in (1,1,5) do (
echo カウント: %%I
)
endlocal
pause と timeout の使い方
pause はキーが押されるまで待機、timeout は指定秒数待機します。
詳しくは「pause が効かない・一瞬で閉じるときの原因と対処法」も参照してください。
@echo off :: pause: キーが押されるまで待機 echo 何かキーを押すと続きます... pause :: timeout: 指定秒数待機(/noreask でキー入力不要) echo 3秒後に処理を続けます... timeout /t 3 /nobreak >nul echo 処理を続けます
ERRORLEVEL でエラーをチェックする
コマンド実行後の成否は ERRORLEVEL(または %errorlevel%)で確認できます。0は成功、1以上はエラーを示すことが多いです。
エラーハンドリングの詳細は「ERRORLEVEL を使ってエラーハンドリングを行う方法」を参照してください。
@echo off
setlocal
:: xcopy でファイルをコピー
xcopy "C:\source\*" "C:\dest\" /e /y
:: ERRORLEVEL でコピーの成否を確認
if %errorlevel% neq 0 (
echo [ERROR] コピーに失敗しました
exit /b 1
)
echo コピーが完了しました
endlocal
実践例A:ドキュメントフォルダを日付フォルダにバックアップ
ドキュメントフォルダを日付付きフォルダに自動バックアップする例です。ダブルクリックするだけで動きます。
@echo off
setlocal
:: ========================
:: ファイルバックアップ
:: ========================
:: バックアップ元と保存先の設定
set "SRC=C:\Users\%USERNAME%\Documents"
set "DST=D:\backup\%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%"
:: 保存先フォルダを作成(なければ作る)
if not exist "%DST%\" mkdir "%DST%"
echo バックアップ開始: %SRC%
echo 保存先: %DST%
echo.
:: xcopy でコピー(/e サブフォルダも含む、/y 上書き確認なし)
xcopy "%SRC%\*" "%DST%\" /e /y
if %errorlevel% neq 0 (
echo [ERROR] バックアップに失敗しました
pause
exit /b 1
)
echo.
echo バックアップ完了しました
echo 保存先: %DST%
pause
endlocal
実践例B:システム情報をログファイルに記録する
ホスト名・IPアドレス・ディスク容量をテキストファイルに記録する例です。定期実行にも使えます。
@echo off setlocal :: ======================== :: システム情報を記録 :: ======================== set "LOG=C:\logs\sysinfo_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt" :: ログフォルダ作成 if not exist "C:\logs\" mkdir "C:\logs" echo システム情報記録開始: %DATE% %TIME% >> "%LOG%" echo ========================= >> "%LOG%" :: ホスト名・ユーザー名 echo [ホスト名] >> "%LOG%" hostname >> "%LOG%" :: IPアドレス echo [IPアドレス] >> "%LOG%" ipconfig | findstr "IPv4" >> "%LOG%" :: ディスク空き容量 echo [ディスク空き容量] >> "%LOG%" wmic logicaldisk get caption,freespace,size /format:csv >> "%LOG%" echo 記録完了: %LOG% pause endlocal
実践例C:今日の日付フォルダにファイルを自動整理する
受信フォルダ(inbox)のテキストファイルを年/月-日フォルダに自動仕分けする例です。毎朝実行するタスクスケジューラと組み合わせると便利です。
@echo off
setlocal
:: ===================================
:: 今日の日付フォルダに整理する
:: ===================================
set "SRC_DIR=C:\Work\inbox"
set "YEAR=%DATE:~0,4%"
set "MONTH=%DATE:~5,2%"
set "DAY=%DATE:~8,2%"
set "DEST_DIR=C:\Work\sorted\%YEAR%\%MONTH%-%DAY%"
:: 保存先フォルダを作成
if not exist "%DEST_DIR%\" mkdir "%DEST_DIR%"
echo 処理開始: %SRC_DIR%
echo 移動先: %DEST_DIR%
echo.
:: inboxフォルダのすべての .txt を今日の日付フォルダへ移動
set "COUNT=0"
for %%F in ("%SRC_DIR%\*.txt") do (
move "%%F" "%DEST_DIR%\"
set /a COUNT+=1
)
echo %COUNT%件のファイルを移動しました
echo 移動先: %DEST_DIR%
pause
endlocal
よくある落とし穴5選
落とし穴1:保存時に「.bat.txt」になってしまう
メモ帳でそのまま保存すると .txt が自動付加されることがあります。
:: NG: メモ帳でファイルを保存するとき「hello.bat.txt」になるケース :: :: 対処法: :: メモ帳の「名前を付けて保存」でファイル名を :: "hello.bat" (ダブルクォートで囲む) :: とするか、「ファイルの種類」を「すべてのファイル」にする :: :: または拡張子を表示する設定にしてエクスプローラーで確認する
落とし穴2:スペースを含むパスをクォートしていない
パスにスペースが含まれる場合は必ずダブルクォートで囲みます。
:: NG: スペースを含むパスはそのまま書くと失敗する copy C:\My Documents\report.txt D:\backup\ :: OK: ダブルクォートで囲む copy "C:\My Documents\report.txt" "D:\backup\"
落とし穴3:変数代入で = の周囲にスペースを入れる
set NAME = 値 とすると、変数名が NAME (末尾スペース付き)になります。
:: NG: 変数代入のとき = の前後にスペースを入れると変数名に含まれる set NAME = 山田 :: 変数名は "NAME " (末尾スペース付き) になる :: OK: = の前後にスペースを入れない set "NAME=山田" :: ダブルクォートで囲むのがベストプラクティス
落とし穴4:if 文で複数コマンドを & でつなぐ
if文で複数処理をしたいときは & ではなく () ブロックを使います。
:: NG: ) の前に他のコマンドがある行は意図通り動かない
if "%X%"=="OK" echo 成功 & echo 完了
:: OK: 複数コマンドは () でブロック化する
if "%X%"=="OK" (
echo 成功
echo 完了
)
落とし穴5:@echo off の位置とBOM問題
@echo off は1行目に書き、ファイルはBOMなしで保存します。
:: NG: @echo off より前にコードがあるとコマンド名が表示される echo 何か処理 @echo off :: OK: 1行目を @echo off にする @echo off echo 何か処理 :: :: NG: バッチファイルをBOM付きUTF-8で保存するとBOMがコマンドとして解釈される :: 対処: BOMなしUTF-8 または ANSI(Shift-JIS) で保存する
よくある質問(FAQ)
pause を追加してください。実行後にキー待ち状態になり、ウィンドウが閉じなくなります。エラーが出ている場合でも確認できます。@echo off を外して @echo on にすると、実行中のコマンドがすべて表示されます。また、echo %変数名% で変数の中身を確認できます。問題のある箇所に pause を挿入して逐次確認するのが基本的なデバッグ方法です。まとめ
バッチファイルの作り方と基本コマンドをまとめます。
| 項目 | 内容 |
|---|---|
| 作成ツール | メモ帳(すぐ使える)・VSCode(開発向け) |
| 保存形式 | 拡張子 .bat、文字コード ANSI or UTF-8(BOMなし) |
| 基本の1行目 | @echo off(ほぼ必須) |
| 画面表示 | echo メッセージ |
| 変数 | set "変数名=値" / %変数名% |
| 条件分岐 | if 文 |
| 繰り返し | for 文 |
| 一時停止 | pause / timeout /t 秒数 |
| エラー確認 | if %errorlevel% neq 0 |
まずは本記事の基本ひな形をコピーして動かしてみてください。実際に動くものを作りながら少しずつコマンドを追加していくのが、バッチファイル習得の近道です。
