A1. 逆引き参照

3つの入口から該当箇所を引く索引。本編が「学ぶ順」、この付録が「探す順」です

📅 作成: 2026-08-25 / 更新: 2026-10-12

どの索引を使うか

索引手がかりこんなとき
索引A
やりたいこと
日本語の目的これから書く。何を使えばいいか分からない
索引B
他言語の構文
既知言語の書き方書きたい処理は頭にあり、記法だけが分からない
索引C
症状
エラー文・おかしな挙動すでに書いたものが動かない

参照先の略号

略号資料
第1回01. バッチの実行モデル
第2回02. 制御構文と展開の罠
第3回03. 実務で使えるバッチを書く
早見表記法早見表
落とし穴落とし穴カタログ
  1. 索引A: やりたいこと逆引き
  2. 索引B: 他言語からの逆引き
  3. 索引C: 症状からの逆引き

索引A: やりたいこと逆引き

ファイルとフォルダ

やりたいこと使うもの参照先
フォルダ内のファイルを1つずつ処理するfor %%f in (*) do02.3
サブフォルダも含めて処理するfor /r02.3
フォルダだけを処理するfor /d02.3
ファイル・フォルダの存在を確認するif exist "path"02.2
フォルダを作る(あってもエラーにしない)md "path" 2>nul03.5
ファイル名・拡張子・フォルダを分解する%~n1 %~x1 %~dp101.5
大量ファイルを差分コピーするrobocopy03.5
共有フォルダ(UNC パス)を扱うpushd / popd03.4

テキストの読み書き

やりたいこと使うもの参照先
テキストファイルを1行ずつ読むfor /f "delims=" %%l in (a.txt)02.3
空白を含むパスのファイルを読むusebackq02.3
CSV を列に分解するtokens / delims02.3
ヘッダ行を読み飛ばすskip=102.3
コマンドの出力を1行ずつ処理するfor /f … in ('cmd')02.3
ファイルに書き出すecho … > file / >>早見表 7章
文字列を検索するfindstr早見表 8章
出力を捨てる>nul / 2>nul早見表 7章

変数と値の加工

やりたいこと使うもの参照先
変数に値を入れる(安全な形)set "V=値"01.3
数を数える・計算するset /a01.3
ループの中でカウントする!VAR!(遅延展開)02.4
記号(& |)を含む値を扱う!VAR! で読む02.4
文字列の一部を取り出す%V:~0,3%02.5
文字列を置換・削除する%V:a=b% / %V:a=%02.5
文字列を含むか判定するif not "%V:x=%"=="%V%"02.5
環境変数を汚さないsetlocal01.3
呼び出し元に値を1つ返すendlocal & set "V=%V%"03.5

制御と構造

やりたいこと使うもの参照先
条件で分岐するif "%A%"=="x" ( … ) else ( … )02.2
数値を比較するGEQ LSS 等02.2
3つ以上に分岐するgoto でラベルへ02.2
回数を指定して繰り返すfor /l02.3
ループを抜ける(break の代用)goto02.3
処理を関数のようにまとめるcall :label / goto :eof02.6
真偽値を返すexit /b 0 / exit /b 102.6
別のバッチを呼んで戻るcall other.cmd02.6
ps1 や exe を起動するpowershell -File / start ""03.8

エラー処理と終了コード

やりたいこと使うもの参照先
失敗したらそこで止めるコマンド || exit /b 103.5
成功したときだけ次に進むコマンド && 次01.4
ブロックの中で終了コードを見るif errorlevel 1 / !errorlevel!02.4
robocopy の成否を判定するif errorlevel 803.5
成功・失敗の両方で後始末を通すgoto :finish で合流03.5
自分の終了コードを返すexit /b n01.4

引数と実行環境

やりたいこと使うもの参照先
引数を受け取る%~101.5
引数がないときヘルプを出すif "%~1"=="" goto :usage03.7
オプション(-v 等)を解析するshift ループ03.7
スクリプトと同じ場所のファイルを参照する"%~dp0file"03.4
カレントディレクトリを固定するpushd "%~dp0"03.4
管理者権限があるか確認するnet session >nul 2>&103.4
ダブルクリックでも結果を読ませるpause03.4

日時・ログ・文字コード

やりたいこと使うもの参照先
日付入りのファイル名を作る(確実な方法)PowerShell の Get-Date を呼ぶ03.3
日時を高速に取得する(自分専用)%DATE:/=% / %TIME: =0%03.3
画面の出力をログに残す>> log.txt 2>&103.6
画面とログの両方に出す:log サブルーチンで2回 echo03.6
日付ごとにログを分けるlog\job_%TODAY%.log03.6
日本語を正しく表示するSJIS + CRLF で保存する03.2
コードページに依存しないようにするメッセージを英数字だけにする03.2

書き始める・デバッグする

やりたいこと使うもの参照先
新しくバッチを書き始めるdocs\samples\templates\tool.cmd をコピー03.8
ps1 のランチャーを作るdocs\samples\templates\launcher.cmd03.8
定時実行のバッチを作るdocs\samples\templates\batchjob.cmd03.8
動かない原因を調べる@echo off を外す01.2
変数に何が入っているか確認するset VAR(前方一致で表示)01.3
配布前に確認するチェックリスト10項目03.8
バッチをやめる判断をする限界の4条件03.9

索引B: 他言語からの逆引き

本編の各回にある対比表は「学ぶための対比」で、対比が破綻する点の説明を含みます。この索引は「引くための対比」なので、記法と参照先だけに絞っています。

基本構文

JSJava / C#バッチ参照先
console.log(x)System.out.println(x)echo %x%01.2
let n = 5int n = 5;set "n=5"01.3
n + 1n + 1set /a n=n+101.3
// コメント// コメントrem コメント01.2
process.env.XSystem.getenv("X")%X%01.3

条件とループ

JSJava / C#バッチ参照先
if (a === b)if (a.equals(b))if "%a%"=="%b%"02.2
if (n >= 10)if (n >= 10)if %n% GEQ 1002.2
if (!x)if (x == null)if not defined x02.2
switchswitchgoto でラベルへ02.2
for (const x of arr)for (var x : arr)for %%x in (…) do02.3
for (let i=0;i<n;i++)同じfor /l %%i in (1,1,n)02.3
breakbreakgoto :out02.3
continuecontinueif で処理全体を囲む02.3
arr[i]arr[i]存在しない03.9

関数とエラー処理

JSJava / C#バッチ参照先
function f() {}メソッド:f ラベル02.6
f(a)f(a)call :f "a"02.6
仮引数仮引数%~102.6
returnreturn;goto :eof02.6
return truereturn true;exit /b 0(0 が真)02.6
throwthrowexit /b 101.4
try / catchtry / catch|| ( … )03.5
finallyfinallygoto :finish で合流03.5
process.exit(1)System.exit(1)exit /b 101.4

文字列とパス

JSJava / C#バッチ参照先
s.slice(0,3)s.substring(0,3)%s:~0,3%02.5
s.replaceAll("a","b")s.replace("a","b")%s:a=b%02.5
s.includes("a")s.contains("a")if not "%s:a=%"=="%s%"02.5
s.lengths.length()直接はできない02.5
正規表現Patternfindstr /r(限定的)早見表 8章
__dirname実行パス取得%~dp003.4
path.basename(p)Path.GetFileName(p)%~nx101.5
path.extname(p)Path.GetExtension(p)%~x101.5
JSON.parseJSON ライブラリない03.9

引数・入出力・日時

JSJava / C#バッチ参照先
process.argv[2]args[0]%~101.5
process.argv.slice(2)args%*01.5
fs.readFileSyncFiles.readAllLinesfor /f02.3
fs.writeFileSyncFiles.writeecho … > file早見表 7章
fs.existsSyncFiles.existsif exist02.2
ロガーLogger>> log 2>&103.6
new Date()LocalDateTime.now()PowerShell を呼ぶ03.3
child_process.execProcessBuilderコマンドをそのまま書く01.2

バッチに対応するものがない機能を見つけたら、それは設計を変える合図です。この索引で「存在しない」「ない」と書かれている行(配列、JSON、正規表現、文字数)は、代用を書くこともできますが、書いた分だけ壊れやすくなります。03.9の4条件と照らして、バッチを続けるか判断してください。

索引C: 症状からの逆引き

参照先の番号は落とし穴カタログの項番です。

値・変数がおかしい

症状まず疑うところ参照先
ループ内の出力が初期値のまま変わらない%VAR% を !VAR! にする(遅延展開)#1
比較が成立しないset VAR = value の空白 / 未定義変数#2
値の末尾に空白が入っているset "名前=値" の形にする#2
%VAR% がそのまま表示されるコマンドプロンプトに直接打っている。未定義の変数は、バッチ内では空になるが、プロンプトでは元の文字列が残る01.2
& を含む値を echo したら壊れた展開結果が読み直されている。!VAR! で読む02.4
実行後、環境変数が書き換わっているsetlocal がない#13
拡張子なしのファイルで変な値になる空の変数に置換記法を使っている02.8

エラーメッセージが出る

メッセージまず疑うところ参照先
… の使い方が誤っています。
… was unexpected at this time.
括弧・引用符・エスケープ(& | %)#10
コマンドの構文が誤っています。
The syntax of the command is incorrect.
引用符 / 空白を含むパス / :: を括弧内に書いた#5 #9
指定されたパスが見つかりません。
The system cannot find the path specified.
カレントディレクトリ / %~dp0 の連結#4
UNC パスはサポートされません。
UNC paths are not supported.
cd を pushd にする#14
パス演算子の次の使用法は無効です
The following usage of the path operator … is invalid
%~ の直後が修飾子になっていない(コメント行も対象)01.2
指定されたバッチ ラベルが見つかりません - …
The system cannot find the batch label specified - …
goto 先のスペル / :: の位置#9
'…' は、内部コマンドまたは外部コマンド…
'…' is not recognized as an internal or external command…
値の中の & が区切りとして解釈された02.4

表示・文字が壊れる

症状まず疑うところ参照先
日本語が ? や別の文字になるファイルの文字コード(SJIS + CRLF で保存する)#3
自分の環境では動くのに CI で化けるコンソールのコードページ(65001 を継承している)#3
1行目でエラーになるUTF-8 の BOM が付いている#3
% が消える / 別の文字に化けるバッチ内では %% と書く#10
! が消える遅延展開が有効。^^! とエスケープする02.4
ファイル名に空白が混じる%TIME% の先頭空白。%TIME: =0% で置換する03.3

処理の流れがおかしい

症状まず疑うところ参照先
エラーが出ているのに処理が続行する終了コードを確認していない(例外はない)#6
if の中の %errorlevel% が期待と違うブロック進入時の値に固定されている#7
robocopy が成功なのに失敗と判定される1〜7 も成功。if errorlevel 8 で判定する03.5
呼び出したバッチから戻ってこないcall を付けていない#12
最後のサブルーチンが余分に実行されるメイン処理の末尾に goto :eof がない02.6
else を書いたら構文エラーになった) else ( を同じ行に置く02.2
実行後、ウィンドウが一瞬で閉じるexit に /b がない / pause がない#8
無人実行で止まったまま進まないpause が入っている03.4
引数解析が無限ループになるshift の位置03.7
使い方の表示で、ファイル名のところに -v などの引数が出るshift は %0 もずらす#15

ファイル・パスの問題

症状まず疑うところ参照先
ダブルクリックでは動くのに別の場所からだと失敗するカレントディレクトリを固定していない#4
パスに空白が含まれると失敗する引用符の付け方(値には引用符を含めない)#5
パスの区切りが \\ になっている%~dp0 の末尾に \ が付いている03.4
for /f でファイル名が1行として処理される引用符を付けている。usebackq で意味を切り替える#11
ログやバックアップでディスクが埋まる古いファイルの削除処理がない03.6
共有フォルダで動かないcd ではなく pushd を使う#14

症状から引けなかったときは @echo off を外してください。実行される1行1行が展開後の姿で表示されるため、どの行でどう化けたかが直接見えます。バッチにはデバッガがないので、これが最も確実な調査手段です。