付録: 逆引き参照

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

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

どの索引を使うか

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

参照先の略号

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

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

ファイルとフォルダ

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

テキストの読み書き

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

変数と値の加工

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

制御と構造

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

エラー処理と終了コード

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

引数と実行環境

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

日時・ログ・文字コード

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

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

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

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

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

基本構文

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

条件とループ

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

関数とエラー処理

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

文字列とパス

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

引数・入出力・日時

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

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

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

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

値・変数がおかしい

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

エラーメッセージが出る

メッセージまず疑うところ参照先
この時点では予期されていません。括弧・引用符・エスケープ(& | %#10
コマンドの構文が誤っています。引用符 / 空白を含むパス / :: を括弧内に書いた#5 #9
指定されたパスが見つかりません。カレントディレクトリ / %~dp0 の連結#4
UNC パスはサポートされません。cdpushd にする#14
パス演算子の次の使用方法は無効です%~ の直後が修飾子になっていない(コメント行も対象)第1回 2章
ラベルが見つからない旨のメッセージgoto 先のスペル / :: の位置#9
'…' は、内部コマンドまたは外部コマンド…値の中の & が区切りとして解釈された第2回 4章

表示・文字が壊れる

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

処理の流れがおかしい

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

ファイル・パスの問題

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

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