0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windowsバッチファイル徹底入門 ~基礎から実践・応用まで~ (Copilot作成)

Last updated at Posted at 2025-04-23

自分のバッチ学習用に、Copilotにサンプルを作成してもらったので、さらに記事としてまとめてもらいました。
AI作成なので、それを前提に参考にしてください。

Windowsバッチファイル徹底入門 ~基礎から実践・応用まで~

はじめに

本記事では、Windowsバッチファイル(.bat)の基礎から応用・実務活用までを体系的に解説します。サンプルコードや実践的なトレーニング例を多数掲載し、初心者から上級者まで幅広く役立つ内容です。

注意
変数の展開(%VAR%など)は「バッチファイル」として実行した場合に正しく動作します。コマンドプロンプトで1行ずつ入力した場合は展開されません。


batの特徴・活用

  • Windows標準で動作し、追加ソフト不要
  • ファイル操作・自動化・データ加工・API連携など多用途
  • コマンドプロンプトの知識がそのまま活かせる
  • 他言語(Java/Python等)との連携も可能
  • 実務現場での自動化・定型作業効率化に最適

基本操作

コメント

バッチファイル内でコメントを書く方法です。REMまたは::を使います。コメントは実行時に無視され、説明やメモとして利用します。

REM これはコメントです
:: これもコメントです

変数と表示

setコマンドで変数を定義し、%VAR%で参照します。バッチファイルでは変数名の大文字・小文字は区別されません。

set VAR=Hello
echo %VAR%

入力の取得

set /pでユーザーから入力を受け取り、変数に格納します。echoでその値を表示できます。

set /p NAME=名前を入力してください:
echo %NAME% さん、こんにちは。

if文(条件分岐)

if文で条件によって処理を分岐します。数値比較にはEQU(等しい)、LSS(未満)などの演算子が使えます。

set NUM=5
if %NUM% LSS 10 echo 10未満です

for文(繰り返し)

for文でファイルや数値、文字列のリストを繰り返し処理します。/lオプションで数値範囲のループが可能です。

for %%i in (*.txt) do echo %%i
for /l %%i in (1,1,5) do echo %%i

ファイルの存在確認

if existでファイルやディレクトリの有無を判定します。ファイル名の後ろにnulを付けるとディレクトリの存在確認も可能です。

if exist sample.txt echo ファイルがあります

遅延環境変数展開

setlocal enabledelayedexpansionを使うと、!VAR!でループやif文の中でも変数の最新値を参照できます。通常の%VAR%はループ開始時の値しか参照できません。

setlocal enabledelayedexpansion
set VAR=1
for %%i in (a b) do (
  set VAR=2
  echo !VAR!
)
endlocal

エラー処理

コマンドの終了コード(%ERRORLEVEL%)でエラー判定ができます。if errorlevel nはn以上の値で真となります。

dir notfound.txt
if errorlevel 1 echo エラーが発生しました

goto/call文

gotoでラベルにジャンプし、call :ラベルでサブルーチンを呼び出します。exit /bでサブルーチンやバッチの処理を終了します。

goto SKIP
echo これは表示されません
:SKIP
echo ここにジャンプします

call :sub
exit /b
:sub
echo サブルーチンです
exit /b

初級 ~シンプルなバッチ例~

1. 文字表示・変数

echoで文字列を表示し、setで変数を定義・参照します。変数は%変数名%で展開されます。

echo こんにちは!バッチファイルの世界へようこそ。
set message=バッチファイルで変数を使っています!
echo %message%

2. 入力と条件分岐

set /pで入力を受け取り、if文で条件分岐します。%変数名%で入力値を参照します。

set /p name=あなたの名前を入力してください:
echo こんにちは、%name% さん!
set /p age=あなたの年齢を入力してください:
echo %name% さんは %age% 歳です。

3. if文による分岐

if文で文字列比較を行い、elseで分岐先を指定します。==は文字列比較です。

set /p answer=5の答えを入力してください:
if %answer%==five (
    echo 正解です!fiveです。
) else (
    echo 不正解です。5ではありません。
)

4. for文による繰り返し

for文でリスト内の値を順に変数(%%i)に代入し、繰り返し処理します。

for %%i in (1 2 3 4 5) do (
    echo %%i 回目の処理です。
)

5. ファイルの存在確認

if existでファイルの有無を判定し、echoで結果を表示します。

set filename=learn002.bat
if exist %filename% (
    echo %filename% は存在します。
) else (
    echo %filename% は存在しません。
)

6. 入力値のデフォルト設定

if文で変数が空かどうかを判定し、空ならデフォルト値を代入します。

set /p VAR=値を入力してください(未入力ならdefault):
if "%VAR%"=="" set VAR=default
echo 入力値: %VAR%

7. サブルーチンの呼び出し

call :ラベルでサブルーチンを呼び出し、exit /bでサブルーチンから抜けます。

call :hello
exit /b
:hello
echo サブルーチンからの出力
exit /b

中級 ~実務的なバッチ処理~

1. ファイルの存在チェックと内容表示

if existでファイルの有無を判定し、typeで内容を表示します。elseでエラー表示も可能です。

if exist sample.txt (
    type sample.txt
) else (
    echo sample.txt は存在しません。
)

2. ファイルの行数カウント

for /fでファイルを1行ずつ読み込み、set /aでカウンタ変数を加算します。enabledelayedexpansionでループ内の変数を即時参照します。

setlocal enabledelayedexpansion
set count=0
for /f "delims=" %%a in (sample.txt) do (
    set /a count+=1
)
echo sample.txt の行数: !count!
endlocal

3. 日付ごとにログファイルを分割保存

%date%変数を加工してファイル名に使い、>>で追記します。日付の部分抽出は%date:~開始,長さ%で行います。

set LOGFILE=log_%date:~0,4%%date:~5,2%%date:~8,2%.txt
echo 本日のログ >> %LOGFILE%

4. 複数ファイルの一括リネーム

for文でファイルを列挙し、renで拡張子を変更します。%%~nfはファイル名部分のみを取得します。

for %%f in (*.txt) do (
    ren "%%f" "%%~nf.bak"
)

5. サブディレクトリ内のファイル一覧取得

dir /s /bで指定ディレクトリ以下の全ファイルパスを取得し、ファイルに出力します。

dir /s /b "対象ディレクトリ" > list.txt

6. ファイルサイズが指定値以上のファイル抽出

for文でファイルを列挙し、%%~zaでファイルサイズを取得します。ifで閾値以上か判定します。

setlocal enabledelayedexpansion
set THRESHOLD=1048576
for %%f in (*) do (
    set size=0
    for %%a in ("%%f") do set size=%%~za
    if !size! geq !THRESHOLD! echo %%f (!size! bytes)
)
endlocal

7. ファイルのバックアップ(拡張子追加)

for文で.logファイルを列挙し、copy.bak拡張子付きでバックアップします。

for %%f in (*.log) do (
    copy "%%f" "%%f.bak" >nul
)

8. ファイルの拡張子一括変換

for文で.bakファイルを列挙し、renで.txtにリネームします。

for %%f in (*.bak) do (
    ren "%%f" "%%~nf.txt"
)

上級 ~応用・自動化・外部連携~

1. 再帰検索で特定拡張子ファイルをリストアップ

dir /s /bで全サブディレクトリから指定拡張子のファイルを検索し、リストファイルに出力します。

dir /s /b *.log > result_log_files.txt

2. 正規表現でメールアドレス抽出

findstr /rで正規表現検索し、メールアドレス形式の文字列を抽出します。

findstr /r /i "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z][a-zA-Z]+" *.txt > result_emails.txt

3. APIリクエスト(curl利用)

curlコマンドでWeb APIにGETリクエストを送り、レスポンスをファイルに保存します。

curl -L -o api_response.txt "https://example.com/api"

4. ファイルのAES暗号化(PowerShell連携)

powershellコマンドでファイルをAES暗号化します。バッチからPowerShellの機能を呼び出す例です。

REM 鍵生成・暗号化例(詳細はPowerShellスクリプト参照)
powershell -Command "..."

5. ファイルのシャッフル出力(PowerShell連携)

PowerShellのGet-Randomで行をランダムに並べ替え、Set-Contentで出力します。

for %%f in (*.txt) do powershell -Command "Get-Content '%%f' | Get-Random -Count 1000 | Set-Content -Encoding UTF8 'shuffled_output.txt' -Append"

ファイルの内容を1行ずつ表示(for /f)

for /fでファイルの各行を1行ずつ読み込み、echoで表示します。

for /f "delims=" %%a in (sample.txt) do echo %%a

choiceコマンドによるメニュー選択

choiceで選択肢を提示し、if errorlevelで選択結果に応じて処理を分岐します。

@echo off
choice /c 123 /m "操作を選択してください(1:表示 2:日付 3:終了)"
if errorlevel 3 goto END
if errorlevel 2 goto DATE
if errorlevel 1 goto SHOW
:SHOW
echo ファイル一覧:
dir
pause
goto END
:DATE
echo 今日の日付: %date%
pause
:END
echo 終了します

ファイルの最終更新日でフィルタ

%%~tfでファイルの更新日時を取得し、指定日と比較します。

for %%f in (*.txt) do (
  for %%d in (%%~tf) do if "%%d" geq "2025/04/01" echo %%f (%%d)
)

PowerShell連携でクリップボードにコピー

powershellSet-Clipboardで文字列をクリップボードにコピーします。

echo コピーしたい内容 | powershell -command "Set-Clipboard"

追加サンプル

ファイルの各行に行番号を付与して表示

for /fで1行ずつ読み込み、カウンタ変数で行番号を付与して表示します。

setlocal enabledelayedexpansion
set n=0
for /f "delims=" %%a in (sample.txt) do (
  set /a n+=1
  echo !n!: %%a
)
endlocal

ファイルの重複行を除去して表示

sortで並べ替え、uniq(またはfor/findstrの工夫)で重複行を除去します。

sort sample.txt | uniq

※Windows標準ではuniqコマンドがないため、findstrやfor文で工夫が必要です。

コマンドライン引数の処理

shiftで引数をずらしながら、すべての引数を順に処理します。

@echo off
:loop
if "%1"=="" goto end
echo 引数: %1
shift
goto loop
:end
echo 全引数の処理が完了しました。

サブルーチンの応用例(複数回呼び出し)

call :ラベル 引数でサブルーチンを引数付きで複数回呼び出します。

@echo off
call :hello World
call :hello Batch
exit /b
:hello
echo こんにちは、%1 さん!
exit /b

実行時の注意
サンプルは「.batファイル」として保存し、コマンドプロンプトから実行してください。直接コマンドプロンプトに貼り付けると動作しない場合があります。


CSV・データ処理バッチ例

CSVファイルの内容表示

typeコマンドでCSVファイルの内容をそのまま表示します。

type sample001.csv

2列目の合計値を計算

for /fで2列目(カンマ区切り)の値を抽出し、set /aで合計します。skip=1でヘッダー行をスキップします。

set sum=0
for /f "skip=1 tokens=2 delims=, " %%a in (sample007.csv) do set /a sum+=%%a
echo 2列目合計: %sum%

2列目の平均値を計算

合計値と件数をカウントし、最後に割り算して平均値を計算します。

set sum=0
set count=0
for /f "skip=1 tokens=2 delims=, " %%a in (sample008.csv) do (
    set /a sum+=%%a
    set /a count+=1
)
set avg=0
if not %count%==0 set /a avg=sum/count
echo 2列目平均値: %avg%

ヘッダー行をスキップして全データ表示

for /fskip=1でヘッダー行をスキップし、2行目以降を表示します。

for /f "skip=1 tokens=*" %%a in (sample003.csv) do echo %%a

条件付き集計(2列目が100以上のみ合計)

2列目の値が100以上の行だけを合計します。ifで条件判定し、set /aで加算します。

set sum=0
for /f "skip=1 tokens=2 delims=, " %%a in (sample007.csv) do if %%a geq 100 set /a sum+=%%a
echo 2列目100以上の合計: %sum%

利用ユースケース

  • 定型作業の自動化:ファイル整理、バックアップ、リネーム
  • データ集計・加工:CSV/テキストの集計・変換
  • API・外部サービス連携:curlやPowerShellでWeb APIや暗号化
  • 監視・通知:ファイル監視や変更通知
  • 他言語連携:Java/Pythonスクリプトの自動実行

トラブルシューティング・よくある落とし穴

  • 変数参照ミス(%VAR%の%忘れ、遅延展開の!VAR!忘れ)
  • パスにスペースがある場合は"で囲む
  • for文やif文の括弧の位置やスペースに注意
  • choiceコマンドのerrorlevelの値の逆転に注意

まとめ・Tips

  • バッチは「小さく始めて大きく育てる」自動化の第一歩
  • PowerShellや他言語と組み合わせることで更に強力に
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?