batch-files について
batch-filesは、Windowsの.batおよび.cmdスクリプトの作成、編集、デバッグ、保守を支援するスキルです。cmd.exeの構文と、自動化、コマンドラインツール、システム管理向けの実践方法を扱います。
主な機能
- 01バッチ構文と変数処理
- 02制御フローと引数解析
- 03エラー処理と終了コード
- 04ファイル、テキスト、ネットワーク、システムのコマンド
- 05スクリプト構成と実践的な指針
活用シーン
- 01ファイル操作やバックアップの自動化
- 02PATH上で使うコマンドラインスクリプトの作成
- 03引用符や変数展開の問題のデバッグ
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ github/ awesome-copilot --skill batch-filesインストール後、Claude Code で/batch-filesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/executable.txtlibrary.txttask.txtreferences/batch-files-and-functions.mdcygwin.mdmsys2.mdtools-and-resources.mdwindows-commands.mdwindows-subsystem-on-linux.md詳細
バッチファイル
cmd.exe を使用して Windows バッチファイル(.bat/.cmd)を作成、編集、デバッグ、保守するための包括的なスキルです。CLI ツールの開発、システム管理の自動化、スケジュールされたタスク、ファイル操作のスクリプト、PATH を使用した実行可能スクリプトに適用できます。
このスキルを使用する場面
.batまたは.cmdファイルを作成または編集する- Windows のタスク(ファイル操作、デプロイ、バックアップ)を自動化する
- PATH 上の
bin/フォルダーに配置する CLI ツールを作成する - スケジュールされたタスクのスクリプト(SCHTASKS、Task Scheduler)を作成する
- バッチスクリプトの問題(変数展開、エラーレベル、引用符)をデバッグする
- バッチスクリプトを外部ツール(curl、git、Node.js、Python)と連携させる
- 構造化されたテンプレートを使って、新しいバッチベースのプロジェクトのひな形を作成する
前提条件
- Windows NT ベースの OS(Windows 7 以降)
- cmd.exe(組み込み)
- 任意:スクリプトをコマンドとして配布するための、PATH 上の
bin/ディレクトリ - 任意:
.BAT;.CMDを含むように PATHEXT が設定されていること(Windows のデフォルト)
コマンドの解釈
cmd.exe は各行を次の 4 つの段階で順に処理します。
- 変数の置換 —
%VAR%トークンは環境変数の値に置換されます。%0~%9はバッチ引数を参照します。%*はすべての引数に展開されます。 - 引用符とエスケープ — キャレット
^は特殊文字(& | < > ^)をエスケープします。引用符は囲まれた特殊文字の解釈を防ぎます。バッチファイルでは、%%はリテラルの%になります。 - 構文解析 — 行はパイプライン(
|)、複合コマンド(&、&&、||)、括弧で囲まれたグループ( )に分割されます。 - リダイレクト —
>は上書き、>>は追記、<は入力の読み込み、2>は標準エラー出力のリダイレクト、2>&1は標準エラー出力を標準出力に統合、>NULは出力の破棄を行います。
変数
環境変数
set _MY_VAR=Hello World
echo %_MY_VAR%
set _MY_VAR=
- 引数を指定せずに
setを実行すると、すべての変数が一覧表示されます set _PREFIXを実行すると、_PREFIXで始まる変数が一覧表示されます=の前後にスペースを入れないでください —set name = valは変数名が"name "、値が" val"の変数を設定します
特殊変数
| 変数 | 値 |
|---|---|
%CD% | 現在のディレクトリ |
%DATE% | システムの日付(ロケールに依存) |
%TIME% | システム時刻 HH:MM:SS.mm |
%RANDOM% | 疑似乱数(0~32767) |
%ERRORLEVEL% | 最後に実行したコマンドの終了コード |
%USERNAME% | 現在のユーザー名 |
%USERPROFILE% | 現在のユーザープロファイルのパス |
%TEMP% / %TMP% | 一時ファイルのディレクトリ |
%PATHEXT% | 実行可能ファイルの拡張子一覧 |
%COMSPEC% | cmd.exe のパス |
SETLOCAL / ENDLOCAL によるスコープ管理
setlocal
set _LOCAL_VAR=scoped value
endlocal
REM _LOCAL_VAR is no longer defined here
スコープ内のブロックから値を返すには、次のようにします。
endlocal & set _RESULT=%_LOCAL_VAR%
遅延展開
括弧で囲まれたブロック内の変数は、解析時に展開されます。実行時に評価するには、遅延展開を使用します。
setlocal EnableDelayedExpansion
set _COUNT=0
for /l %%i in (1,1,5) do (
set /a _COUNT+=1
echo !_COUNT!
)
endlocal
!VAR!は実行時に展開されます(遅延)%VAR%は解析時に展開されます(即時)
制御フロー
条件付き実行
if exist "output.txt" echo File found
if not defined _MY_VAR echo Variable not set
if "%_STATUS%"=="ready" (echo Go) else (echo Wait)
if %ERRORLEVEL% neq 0 echo Command failed
比較演算子:equ、neq、lss、leq、gtr、geq。大文字と小文字を区別しない文字列比較には /i を使用します。
複合コマンド
command1 & command2 & REM Always run both
command1 && command2 & REM Run command2 only if command1 succeeds
command1 || command2 & REM Run command2 only if command1 fails
FOR ループ
REM Iterate over a set of values
for %%i in (alpha beta gamma) do echo %%i
REM Numeric range: start, step, end
for /l %%i in (1,1,10) do echo %%i
REM Files in a directory
for %%f in (*.txt) do echo %%f
REM Recursive file search
for /r %%f in (*.log) do echo %%f
REM Directories only
for /d %%d in (*) do echo %%d
REM Parse command output
for /f "tokens=1,2 delims=:" %%a in ('ipconfig ^| findstr "IPv4"') do echo %%b
REM Parse file lines
for /f "usebackq tokens=*" %%a in ("data.txt") do echo %%a
GOTO とラベル
goto :main_logic
:usage
echo Usage: %~nx0 [options]
exit /b 1
:main_logic
echo Running main logic...
goto :eof
goto :eof は現在のバッチまたはサブルーチンを終了します。ラベルは : で始まります。
コマンドライン引数
| 構文 | 値 |
|---|---|
%0 | 呼び出し時のスクリプト名 |
%1~%9 | 位置指定引数 |
%* | すべての引数(SHIFT の影響を受けません) |
%~1 | 囲んでいる引用符を削除した引数 1 |
%~f1 | 引数 1 のフルパス |
%~d1 | 引数 1 のドライブ文字 |
%~p1 | 引数 1 のパス(ドライブを含みません) |
%~n1 | 引数 1 のファイル名(拡張子を含みません) |
%~x1 | 引数 1 の拡張子 |
%~dp0 | バッチファイル自体のドライブとパス |
%~nx0 | バッチファイルの拡張子付きファイル名 |
%~z1 | 引数 1 のファイルサイズ |
%~$PATH:1 | PATH を検索して引数 1 を探します |
引数の解析パターン
:parse_args
if "%~1"=="" goto :args_done
if /i "%~1"=="--help" goto :usage
if /i "%~1"=="--output" (
set "_OUTPUT_DIR=%~2"
shift
)
shift
goto :parse_args
:args_done
文字列処理
部分文字列
set _STR=Hello World
echo %_STR:~0,5% & REM "Hello"
echo %_STR:~6% & REM "World"
echo %_STR:~-5% & REM "World"
echo %_STR:~0,-6% & REM "Hello"
検索と置換
set _STR=Hello World
echo %_STR:World=Earth% & REM "Hello Earth"
echo %_STR:Hello=% & REM " World" (remove "Hello")
部分文字列の包含テスト
if not "%_STR:World=%"=="%_STR%" echo Contains "World"
関数
関数では、ラベル、CALL、SETLOCAL/ENDLOCAL を使用します。
@echo off
call :greet "Jane Doe"
echo Result: %_GREETING%
exit /b 0
:greet
setlocal
set "_MSG=Hello, %~1"
endlocal & set "_GREETING=%_MSG%"
exit /b 0
call :label argsは関数を呼び出しますexit /bは関数から戻ります(スクリプト全体からは終了しません)- スコープ付きブロックの外に値を渡すには、
endlocal & setのテクニックを使用します
算術演算
set /a は 32 ビット符号付き整数の算術演算を実行します。
set /a _RESULT=10 * 5 + 3
set /a _COUNTER+=1
set /a _REMAINDER=14 %% 3 & REM Use %% for modulo in batch files
set /a _BITS="255 & 0x0F" & REM Bitwise AND
サポートされる演算子:+ - * / %% ( ) およびビット演算子 & | ^ ~ << >>。
16 進数(0xFF)と 8 進数(077)のリテラルがサポートされています。
エラー処理
エラーレベルの規則
0= 成功- 0 以外 = 失敗(通常は
1)
mycommand.exe
if %ERRORLEVEL% neq 0 (
echo ERROR: mycommand failed with code %ERRORLEVEL%
exit /b %ERRORLEVEL%
)
早期失敗パターン
command1 || (echo command1 failed & exit /b 1)
command2 || (echo command2 failed & exit /b 1)
終了コードの設定
exit /b 0 & REM Return success from a batch/function
exit /b 1 & REM Return failure
cmd /c "exit /b 42" & REM Set ERRORLEVEL to 42 inline
基本コマンドのリファレンス
ファイル操作
| コマンド | 目的 |
|---|---|
DIR | ディレクトリの内容を一覧表示 |
COPY | ファイルをコピー |
XCOPY | サブディレクトリを含めてコピー(レガシー) |
ROBOCOPY | 再試行、ミラーリング、ログ記録に対応した堅牢なコピー |
MOVE | ファイルを移動または名前変更 |
DEL | ファイルを削除 |
REN | ファイル名を変更 |
MD / MKDIR | ディレクトリを作成 |
RD / RMDIR | ディレクトリを削除 |
MKLINK | シンボリックリンクまたはハードリンクを作成 |
ATTRIB | ファイル属性を表示または設定 |
TYPE | ファイルの内容を出力 |
MORE | ファイルをページ単位で表示 |
TREE | ディレクトリ構造を表示 |
REPLACE | コピー元のファイルでコピー先のファイルを置き換え |
COMPACT | NTFS 圧縮の表示または設定 |
EXPAND | .cab ファイルから展開 |
MAKECAB | .cab アーカイブを作成 |
TAR | tar アーカイブを作成または展開 |
テキスト検索と処理
| コマンド | 目的 |
|---|---|
FIND | 文字列をそのまま検索 |
FINDSTR | 限定的な正規表現で検索 |
SORT | 行をアルファベット順に並べ替え |
CLIP | パイプ入力をクリップボードにコピー |
FC | 2 つのファイルを比較 |
COMP | バイナリファイルを比較 |
CERTUTIL | Base64 のエンコード/デコード、ハッシュの計算 |
システム情報
| コマンド | 目的 |
|---|---|
SYSTEMINFO | システム構成全体 |
HOSTNAME | コンピューター名を表示 |
VER | Windows のバージョン |
WHOAMI | 現在のユーザーとグループの情報 |
TASKLIST | 実行中のプロセスを一覧表示 |
TASKKILL | プロセスを終了 |
WMIC | WMI クエリ(ドライブ、OS、メモリ) |
SC | サービスの制御(照会、開始、停止) |
DRIVERQUERY | インストール済みドライバーを一覧表示 |
REG | レジストリ操作(照会、追加、削除) |
SETX | 環境変数を永続的に設定 |
ネットワーク
| コマンド | 目的 |
|---|---|
PING | ネットワーク接続をテスト |
IPCONFIG | IP 構成 |
NSLOOKUP | DNS 検索 |
NETSTAT | ネットワーク接続とポート |
TRACERT | ホストまでのルートを追跡 |
NET USE | ネットワークドライブを割り当て/切断 |
NET USER | ユーザーアカウントを管理 |
NETSH | ネットワーク構成ユーティリティ |
ARP | ARP キャッシュを管理 |
ROUTE | ルーティングテーブルを管理 |
CURL | HTTP リクエスト(Windows 10 以降) |
SSH | セキュアシェル(Windows 10 以降) |
スケジュール設定と自動化
| コマンド | 目的 |
|---|---|
SCHTASKS | スケジュールされたタスクを作成および管理 |
TIMEOUT | N 秒待機(Vista 以降) |
START | プログラムを非同期に起動 |
RUNAS | 別のユーザーとして実行 |
SHUTDOWN | シャットダウンまたは再起動 |
FORFILES | 日付でファイルを検索し、コマンドを実行 |
シェルユーティリティ
| コマンド | 目的 |
|---|---|
WHERE | PATH 内の実行可能ファイルを検索 |
DOSKEY | コマンドマクロを作成 |
CHOICE | 1 キーの入力を促す |
MODE | コンソールのサイズとポートを設定 |
SUBST | フォルダーをドライブ文字に割り当て |
CHCP | コンソールのコードページを取得または設定 |
COLOR | コンソールの色を設定 |
TITLE | コンソールウィンドウのタイトルを設定 |
ASSOC / FTYPE | ファイルタイプの関連付け |
シェルの構文と式
グループ化のための括弧
括弧を使うと、複合コマンドをリダイレクトや条件付き実行のための単一のまとまりにできます。
(echo Line 1 & echo Line 2) > output.txt
if exist "data.csv" (
echo Processing...
call :process "data.csv"
) else (
echo No data found.
)
エスケープ文字
キャレット ^ は次の文字をエスケープします。
echo Total ^& Summary & REM Outputs: Total & Summary
echo 100%% complete & REM Outputs: 100% complete (in batch)
echo Line one^
Line two & REM Caret escapes the newline
パイプの後では、キャレットが3つ必要です:echo x ^^^& y | findstr x
ワイルドカード
*は任意の文字列に一致します?は1文字(ピリオドを含まないセグメントの末尾では0文字)に一致します
dir *.txt & REM All .txt files
ren *.jpeg *.jpg & REM Bulk rename
リダイレクトの概要
command > file.txt & REM Overwrite stdout to file
command >> file.txt & REM Append stdout to file
command 2> errors.log & REM Redirect stderr
command > all.log 2>&1 & REM Merge stderr into stdout
command < input.txt & REM Read stdin from file
command > NUL 2>&1 & REM Discard all output
本番品質のバッチファイルを作成する
標準的なスクリプト構成
@echo off
setlocal EnableDelayedExpansion
REM ============================================================
REM Script: example.bat
REM Purpose: Describe what this script does
REM ============================================================
call :main %*
exit /b %ERRORLEVEL%
:main
call :parse_args %*
if not defined _TARGET (
echo ERROR: --target is required. 1>&2
call :usage
exit /b 1
)
echo Processing: %_TARGET%
exit /b 0
:parse_args
if "%~1"=="" exit /b 0
if /i "%~1"=="--target" set "_TARGET=%~2" & shift
if /i "%~1"=="--help" call :usage & exit /b 0
shift
goto :parse_args
:usage
echo Usage: %~nx0 --target ^<path^> [--help]
echo.
echo Options:
echo --target Path to process (required)
echo --help Show this help message
exit /b 0
ベストプラクティス
- 必ず
@echo offとsetlocalで開始します — 不要な出力や呼び出し元への変数漏れを防ぎます。 - 処理の前に入力を検証します — 必須の引数やファイルの存在を早い段階で確認します。
if not definedとif not existを使用します。 - パスと変数を引用符で囲みます —
"%~1"と"%_MY_PATH%"を使用して、空白や特殊文字を安全に扱います。 exitの代わりにexit /bを使用します — 親のコンソールウィンドウが閉じるのを防ぎます。- 意味のある終了コードを返します — 成功時は
exit /b 0、特定の失敗時は0以外を返します。 - スクリプトからの相対パスには
%~dp0を使用します — 呼び出し元の作業ディレクトリにかかわらず、スクリプトが動作するようにします。 XCOPYよりROBOCOPYを優先します — より信頼性が高く、再試行、ミラーリング、ログ記録に対応しています。- ループ内または括弧で囲まれたブロック内で変数を変更するときは、
EnableDelayedExpansionを使用します。 - エラーは stderr に出力します —
echo ERROR: message 1>&2を使うと、パイプ処理に使う stdout をクリーンに保てます。 - コメントには
REMを使用します —::はFORループ本体内で問題を引き起こすことがあります。
セキュリティに関する考慮事項
- バッチファイルに認証情報を保存しないでください — 環境変数、認証情報ストア、またはプロンプトを使用します。
- ユーザー入力を検証します — 引用符で囲まれていない変数に
&、|、または>が含まれていると、コマンドを挿入されるおそれがあります。必ず引用符で囲みます:"%_USER_INPUT%"。 SETLOCALを使用します — 変数の値が親プロセスに漏れるのを防ぎます。- ファイルパスをサニタイズします — 意図しない削除を防ぐため、
DEL、RD、またはROBOCOPYに渡す前にパスを検証します。 - 機密性の高い入力に
SET /Pを使用しないでください — 入力が画面に表示され、コンソールの履歴に保存されます。可能であれば、専用の認証情報ツールを使用します。
デバッグとトラブルシューティング
| 手法 | 方法 |
|---|---|
| 実行をトレースする | 一時的に @echo off を削除するか、@echo on を使用します |
| ステップ実行する | セクション間に PAUSE を追加します |
| エラーレベルを確認する | 各コマンドの後に echo Exit code: %ERRORLEVEL% を実行します |
| 変数を調べる | set _MY_ で _MY_ から始まるすべての変数を一覧表示します |
| 遅延展開の問題 | ( ) ブロック内の変数が更新されない場合は、!VAR! 構文を有効にします |
FOR ループの %% と % | バッチファイルでは %%i、コマンドラインでは %i を使用します |
| SET 内の空白 | set name = value ではなく set name=value を使用します |
| パイプ内のキャレット | パイプの後では、特殊文字をエスケープするために ^^^ を使用します |
| SET /A 内の括弧 | if ブロック内では ^( と ^) でエスケープするか、引用符を使用します |
| 剰余演算ではパーセント記号を2つ使う | バッチファイルでは set /a r=14 %% 3 を使用します |
クロスプラットフォームおよび拡張ツール
バッチスクリプトの限界に達したときは、次のツールで cmd.exe の機能を拡張できます。
| ツール | 用途 |
|---|---|
| Cygwin | Windows 上の完全な POSIX 環境(grep、sed、awk、ssh) |
| MSYS2 | 軽量な Unix ツールとパッケージマネージャー(pacman) |
| WSL | Windows Subsystem for Linux — ネイティブの Linux バイナリを実行します |
| GnuWin32 | 個別の GNU ユーティリティをネイティブの Windows 実行ファイルとして提供します |
| PowerShell | .NET 統合に対応した最新の Windows スクリプト環境 |
起動の速さ、単純なファイル操作、PATH ベースの CLI ツール、またはタスク スケジューラとの連携が必要な場合は、バッチを使用します。複雑なデータ処理、REST API、またはオブジェクト指向のスクリプトには、PowerShell または WSL を検討してください。
CMD のキーボードショートカット
| ショートカット | 動作 |
|---|---|
Tab | ファイル名/フォルダー名を自動補完します |
Up / Down | コマンド履歴を移動します |
F7 | コマンド履歴のポップアップを表示します |
F3 | 最後のコマンドを繰り返します |
Esc | 現在の行を消去します |
Ctrl+C | 実行中のコマンドをキャンセルします |
Alt+F7 | コマンド履歴を消去します |
参考ファイル
references/ フォルダーには、詳細なドキュメントが含まれています。
| ファイル | 内容 |
|---|---|
tools-and-resources.md | Windows のツール、ユーティリティ、パッケージマネージャー、ターミナル |
batch-files-and-functions.md | スクリプトの例、手法、ベストプラクティスへのリンク |
windows-commands.md | Windows コマンドの包括的な A〜Z リファレンス |
cygwin.md | Cygwin ユーザーガイドと FAQ |
msys2.md | MSYS2 のインストール、パッケージ、環境 |
windows-subsystem-on-linux.md | WSL のセットアップ、コマンド、ドキュメント |
アセットテンプレート
assets/ フォルダーには、テキストファイルとして用意されたバッチファイルのスターターテンプレートデータが含まれています。
| テンプレート | 目的 |
|---|---|
executable.txt | 引数解析機能を備えたスタンドアロンの CLI ツール |
library.txt | CALL で呼び出せるラベルを備えた再利用可能な関数ライブラリ |
task.txt | スケジュールされたタスク/自動化スクリプト |