バッチファイル(.bat)の文法(AI作成)

# はじめに
最近、バッチファイルを作成することになり改めて文法を復習しようと思いました。
それにあたり、web記事などを見ようと思いましたが、それよりもAIにまとめてもらうほうが楽では？と思い、AIに作成してもらいました。
便利ですね～
ただし、AI作成なのでもしかしたら間違いがあるかもれしませんので、参考程度にお願いします。

# バッチファイル（.bat）文法まとめ

## 1. コメント
- REM または :: を使います。
```bat
REM これはコメントです
:: これもコメントです
```
【出力例】
（コメント行は出力されません）

## 2. コマンドの基本
- コマンドプロンプトで使うコマンドをそのまま記述できます。
```bat
echo Hello World
dir
pause
```
【出力例】
```
Hello World
（dirコマンドのファイル一覧表示）
続行するには何かキーを押してください . . .
```
- `echo`：文字や変数の値を表示します。
- `dir`：カレントディレクトリのファイル一覧を表示します。
- `pause`：キー入力待ちにします。

## 3. 変数
- 変数の代入と参照は以下の通りです。
```bat
set VAR=値
echo %VAR%
```
【出力例】
```
値
```
- 変数名は大文字・小文字を区別しません。

## 4. 入力の取得
- ユーザーから入力を受け取るには `set /p` を使います。
```bat
set /p NAME=名前を入力してください:
echo %NAME% さん、こんにちは。
```
【出力例】
```
名前を入力してください:（ここで入力）
（例：山田 と入力）
山田 さん、こんにちは。
```

## 5. if文（条件分岐）
- 条件によって処理を分けます。
```bat
if "%VAR%"=="値" (
  echo 一致しました
) else (
  echo 一致しません
)
```
【出力例】
```
一致しました
```
- 数値比較には `if` の後に `==` 以外も使えます。
```bat
if %NUM% LSS 10 echo 10未満です
```
【出力例】
```
10未満です
```
- 主な比較演算子：EQU（等しい）, NEQ（等しくない）, LSS（未満）, LEQ（以下）, GTR（より大きい）, GEQ（以上）

## 6. for文（繰り返し）
- ファイルや数値、文字列の繰り返し処理ができます。
```bat
for %%i in (*.txt) do echo %%i
```
【出力例】
```
sample1.txt
sample2.txt
...（カレントディレクトリのtxtファイル名が表示される）
```
- 1から5まで繰り返す例：
```bat
for /l %%i in (1,1,5) do echo %%i
```
【出力例】
```
1
2
3
4
5
```
- 変数はバッチファイル内では `%%i`、コマンドプロンプトでは `%i` です。

## 7. goto文（ジャンプ）
- ラベル（:LABEL名）にジャンプします。
```bat
goto SKIP
echo これは表示されません
:SKIP
echo ここにジャンプします
```
【出力例】
```
ここにジャンプします
```

## 8. call文（他バッチやサブルーチンの呼び出し）
```bat
call other.bat
call :subroutine
exit /b

:subroutine
echo サブルーチンです
exit /b
```
【出力例】
```
（other.batの出力）
サブルーチンです
```

## 9. choiceコマンド（選択肢入力）
- ユーザーに選択肢を与えます。
```bat
choice /c YN /m "続行しますか？"
if errorlevel 2 echo いいえが選ばれました
if errorlevel 1 echo はいが選ばれました
```
【出力例】
```
続行しますか？ [Y,N]?
（YまたはNを押す）
はいが選ばれました（Yの場合）
いいえが選ばれました（Nの場合）
```

## 10. shiftコマンド（引数のずらし）
- コマンドライン引数を順番に処理したいときに使います。
```bat
@echo off
:loop
if "%1"=="" goto end
echo %1
shift
goto loop
:end
```
【出力例】
```
（バッチファイルに a b c を渡した場合）
a
b
c
```

## 11. exitコマンド（終了）
- バッチファイルの実行を終了します。
```bat
exit
```
【出力例】
（コマンドプロンプトが閉じる、またはバッチの実行が終了する）
- `exit /b` でサブルーチンやcallから抜けます。
- `/b` オプションは「batch context（バッチコンテキスト）」の略で、バッチファイルやサブルーチン（call :ラベル）から抜ける際に使います。コマンドプロンプト自体は終了せず、バッチの処理だけを終了します。

## 12. エラー処理
- コマンドの終了コード（%ERRORLEVEL%）でエラー判定ができます。
```bat
dir notfound.txt
if errorlevel 1 echo エラーが発生しました
```
【出力例】
```
ファイルが見つかりません。
エラーが発生しました
```

## 13. 特殊変数
- `%0`：バッチファイル自身の名前
- `%1`～`%9`：コマンドライン引数
- `%*`：すべての引数
```bat
echo %0
echo %1
echo %*
```
【出力例】
```
（バッチファイル名）
（1番目の引数）
（すべての引数）
```

## 14. pushd / popd（ディレクトリのスタック操作）
- 一時的にディレクトリを移動し、元の場所に戻ることができます。
```bat
pushd D:\work
rem ここで作業
popd
rem 元のディレクトリに戻る
```
【出力例】
（pushdでD:\workに移動し、popdで元のディレクトリに戻る。画面出力は特になし）

## 15. setlocal / endlocal（変数のローカル化）
- 変数の有効範囲をバッチ内に限定できます。
```bat
setlocal
set VAR=ローカル変数
rem ここだけ有効
endlocal
rem ここではVARは無効
```
【出力例】
（画面出力は特になし。endlocal後はVARが参照できなくなる）

## 16. path, title, color などの環境設定コマンド
- コマンドプロンプトの見た目や動作を変更できます。
```bat
title バッチのタイトル
color 0A
```
【出力例】
（ウィンドウタイトルが「バッチのタイトル」になり、文字色が緑色に変わる）

## 17. shift /n（引数のずらし・拡張）
- shiftコマンドでn番目以降の引数をずらすことができます（Windows 7以降）。
```bat
shift /2
```
【出力例】
（2番目以降の引数が%1, %2...に詰め替えられる。画面出力は特になし）

## 18. 遅延環境変数展開（delayed variable expansion）
- ループやif文の中で変数の値を即時反映したい場合に使います。
```bat
setlocal enabledelayedexpansion
set VAR=1
for %%i in (a b) do (
  set VAR=2
  echo !VAR!
)
endlocal
```
【出力例】
```
2
2
```
- `!VAR!` で遅延展開。

## 19. エスケープ文字（^）
- 特殊文字（&, |, >, <, ^, %, ! など）をエスケープできます。
```bat
echo 1 ^& 2
```
【出力例】
```
1 & 2
```

## 20. サブコマンド（コマンドの中でコマンドを実行）
- `()` で囲むことで複数コマンドをまとめて実行できます。
```bat
(for %%i in (*.txt) do echo %%i) > list.txt
```
【出力例】
（list.txtファイルにtxtファイル名一覧が出力される。画面出力は特になし）

## 21. パイプ（|）・リダイレクト（>、>>、<）
- コマンドの出力を他のコマンドやファイルに渡せます。
```bat
dir | find "txt"
echo Hello > out.txt
echo World >> out.txt
type < in.txt
```
【出力例】
```
（dir | find "txt" の結果：txtを含む行のみ表示）
（out.txtにHello、Worldが追記される）
（in.txtの内容が表示される）
```

## 22. ファイル・ディレクトリの存在確認
- ファイルやフォルダの有無をif existで判定できます。
```bat
if exist sample.txt echo ファイルがあります
if not exist sample.txt echo ファイルがありません
if exist foldername\nul echo フォルダがあります
```
【出力例】
```
ファイルがあります
ファイルがありません
フォルダがあります
```

## 23. time/dateコマンド（時刻・日付の取得）
- システムの日付や時刻を取得できます。
```bat
echo %date%
echo %time%
```
【出力例】
```
2025/04/18
12:34:56.78
```

## 24. set /a（数値計算）
- set /aで四則演算などの計算ができます。
```bat
set /a SUM=1+2
echo %SUM%
```
【出力例】
```
3
```

## 25. choiceコマンドのerrorlevelの注意
- choiceコマンドのerrorlevelは「選択肢の番号が大きいほど値が小さい」ので注意。
```bat
choice /c ABC
rem A=3, B=2, C=1 となる
```
【出力例】
```
（Aを押すとerrorlevel=3、Bで2、Cで1となる）
```

## 26. for /f（テキストファイルやコマンド出力の行ごと処理）
- ファイルやコマンドの出力を1行ずつ処理できます。
```bat
for /f "usebackq delims=" %%a in ("sample.txt") do echo %%a
for /f "delims=" %%a in ('dir /b') do echo %%a
```
【出力例】
```
（sample.txtの各行が表示される）
（カレントディレクトリのファイル名一覧が表示される）
```

## 27. exit /b [数値]（終了コードの指定）
- サブルーチンやバッチの終了時に終了コードを指定できます。
```bat
exit /b 1
```
【出力例】
（終了コード1でバッチやサブルーチンが終了。画面出力は特になし）
- `/b` を付けることで「バッチファイルやサブルーチンのみを終了」し、コマンドプロンプト自体は閉じません。

## 28. set /pでデフォルト値
- 入力がなかった場合のデフォルト値を設定する例。
```bat
set /p VAR=値を入力してください（未入力ならdefault）:
if "%VAR%"=="" set VAR=default
```
【出力例】
```
値を入力してください（未入力ならdefault）：
（何も入力せずEnter）
default
```

## 29. コマンドの連結（&&, ||, &）
- 複数のコマンドを1行で実行できます。
```bat
echo 1 && echo 2   rem 前のコマンドが成功したら次を実行
echo 1 || echo 2   rem 前のコマンドが失敗したら次を実行
echo 1 & echo 2    rem 成否に関係なく両方実行
```
【出力例】
```
1
2
1
1
2
```

## 30. バッチファイルのトラブルシューティング
- エラーの原因を調べるにはechoやpauseを活用し、`@echo on`でコマンドの実行内容を表示できます。
```bat
@echo on
rem コマンドの実行内容が表示される
```
【出力例】
```
@echo on
rem コマンドの実行内容が表示される
```
- 途中で一時停止したい場合はpauseを使います。

## 31. よくある落とし穴・注意点
- 変数の参照ミス（%VAR%の%忘れ、遅延展開の!VAR!忘れ）
- パスにスペースがある場合は"で囲む
```bat
"C:\Program Files\sample.exe"
```
【出力例】
（C:\Program Files\sample.exeが実行される。画面出力は特になし）
- for文やif文の括弧の位置やスペースに注意

## 32. 主なスラッシュ付きオプション（/c, /m, /b など）
- バッチファイルやコマンドプロンプトでよく使われる「/」から始まるオプションの意味をまとめます。

| オプション | 主な用途・意味例 |
|:---|:---|
| /c | `cmd /c` などで「指定したコマンドを実行後、終了」する（cmd.exeのオプション） |
| /k | `cmd /k` などで「指定したコマンドを実行後、ウィンドウを開いたままにする」 |
| /b | `exit /b` で「バッチファイルやサブルーチンのみを終了」する（コマンドプロンプト自体は閉じない） |
| /m | `choice /m` で「メッセージを表示」する（choiceコマンドのオプション） |
| /c | `choice /c` で「選択肢の文字を指定」する（choiceコマンドのオプション） |
| /a | `set /a` で「数値計算モードで変数を設定」する |
| /p | `set /p` で「ユーザー入力を受け取る」 |
| /l | `for /l` で「数値の範囲でループ」する |
| /f | `for /f` で「ファイルやコマンド出力の行ごとにループ」する |
| /n | `shift /n` で「n番目以降の引数をずらす」 |

- これらのオプションはコマンドごとに意味が異なる場合があるため、各コマンドのヘルプ（例：`コマンド名 /?`）で詳細を確認してください。

---

これらはバッチファイルの応用や複雑な処理でよく使われる文法です。必要に応じて活用してください。