mcpField
B
batch-files

batch-files

github.com/github開発40.5k209 回インストール今日更新
リポジトリ

batch-files について

batch-filesは、Windowsの.batおよび.cmdスクリプトの作成、編集、デバッグ、保守を支援するスキルです。cmd.exeの構文と、自動化、コマンドラインツール、システム管理向けの実践方法を扱います。

主な機能

  1. 01バッチ構文と変数処理
  2. 02制御フローと引数解析
  3. 03エラー処理と終了コード
  4. 04ファイル、テキスト、ネットワーク、システムのコマンド
  5. 05スクリプト構成と実践的な指針

活用シーン

  1. 01ファイル操作やバックアップの自動化
  2. 02PATH上で使うコマンドラインスクリプトの作成
  3. 03引用符や変数展開の問題のデバッグ

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/github/awesome-copilot --skill batch-files

インストール後、Claude Code で/batch-filesを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
executable.txt
library.txt
task.txt
references/
batch-files-and-functions.md
cygwin.md
msys2.md
tools-and-resources.md
windows-commands.md
windows-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 つの段階で順に処理します。

  1. 変数の置換 — %VAR% トークンは環境変数の値に置換されます。%0~%9 はバッチ引数を参照します。%* はすべての引数に展開されます。
  2. 引用符とエスケープ — キャレット ^ は特殊文字(& | < > ^)をエスケープします。引用符は囲まれた特殊文字の解釈を防ぎます。バッチファイルでは、%% はリテラルの % になります。
  3. 構文解析 — 行はパイプライン(|)、複合コマンド(&、&&、||)、括弧で囲まれたグループ ( ) に分割されます。
  4. リダイレクト — > は上書き、>> は追記、< は入力の読み込み、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:1PATH を検索して引数 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コピー元のファイルでコピー先のファイルを置き換え
COMPACTNTFS 圧縮の表示または設定
EXPAND.cab ファイルから展開
MAKECAB.cab アーカイブを作成
TARtar アーカイブを作成または展開
テキスト検索と処理
コマンド目的
FIND文字列をそのまま検索
FINDSTR限定的な正規表現で検索
SORT行をアルファベット順に並べ替え
CLIPパイプ入力をクリップボードにコピー
FC2 つのファイルを比較
COMPバイナリファイルを比較
CERTUTILBase64 のエンコード/デコード、ハッシュの計算
システム情報
コマンド目的
SYSTEMINFOシステム構成全体
HOSTNAMEコンピューター名を表示
VERWindows のバージョン
WHOAMI現在のユーザーとグループの情報
TASKLIST実行中のプロセスを一覧表示
TASKKILLプロセスを終了
WMICWMI クエリ(ドライブ、OS、メモリ)
SCサービスの制御(照会、開始、停止)
DRIVERQUERYインストール済みドライバーを一覧表示
REGレジストリ操作(照会、追加、削除)
SETX環境変数を永続的に設定
ネットワーク
コマンド目的
PINGネットワーク接続をテスト
IPCONFIGIP 構成
NSLOOKUPDNS 検索
NETSTATネットワーク接続とポート
TRACERTホストまでのルートを追跡
NET USEネットワークドライブを割り当て/切断
NET USERユーザーアカウントを管理
NETSHネットワーク構成ユーティリティ
ARPARP キャッシュを管理
ROUTEルーティングテーブルを管理
CURLHTTP リクエスト(Windows 10 以降)
SSHセキュアシェル(Windows 10 以降)
スケジュール設定と自動化
コマンド目的
SCHTASKSスケジュールされたタスクを作成および管理
TIMEOUTN 秒待機(Vista 以降)
STARTプログラムを非同期に起動
RUNAS別のユーザーとして実行
SHUTDOWNシャットダウンまたは再起動
FORFILES日付でファイルを検索し、コマンドを実行
シェルユーティリティ
コマンド目的
WHEREPATH 内の実行可能ファイルを検索
DOSKEYコマンドマクロを作成
CHOICE1 キーの入力を促す
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
ベストプラクティス
  1. 必ず @echo off と setlocal で開始します — 不要な出力や呼び出し元への変数漏れを防ぎます。
  2. 処理の前に入力を検証します — 必須の引数やファイルの存在を早い段階で確認します。if not defined と if not exist を使用します。
  3. パスと変数を引用符で囲みます — "%~1" と "%_MY_PATH%" を使用して、空白や特殊文字を安全に扱います。
  4. exit の代わりに exit /b を使用します — 親のコンソールウィンドウが閉じるのを防ぎます。
  5. 意味のある終了コードを返します — 成功時は exit /b 0、特定の失敗時は0以外を返します。
  6. スクリプトからの相対パスには %~dp0 を使用します — 呼び出し元の作業ディレクトリにかかわらず、スクリプトが動作するようにします。
  7. XCOPY より ROBOCOPY を優先します — より信頼性が高く、再試行、ミラーリング、ログ記録に対応しています。
  8. ループ内または括弧で囲まれたブロック内で変数を変更するときは、EnableDelayedExpansion を使用します。
  9. エラーは stderr に出力します — echo ERROR: message 1>&2 を使うと、パイプ処理に使う stdout をクリーンに保てます。
  10. コメントには 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 の機能を拡張できます。

ツール用途
CygwinWindows 上の完全な POSIX 環境(grep、sed、awk、ssh)
MSYS2軽量な Unix ツールとパッケージマネージャー(pacman)
WSLWindows 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.mdWindows のツール、ユーティリティ、パッケージマネージャー、ターミナル
batch-files-and-functions.mdスクリプトの例、手法、ベストプラクティスへのリンク
windows-commands.mdWindows コマンドの包括的な A〜Z リファレンス
cygwin.mdCygwin ユーザーガイドと FAQ
msys2.mdMSYS2 のインストール、パッケージ、環境
windows-subsystem-on-linux.mdWSL のセットアップ、コマンド、ドキュメント

アセットテンプレート

assets/ フォルダーには、テキストファイルとして用意されたバッチファイルのスターターテンプレートデータが含まれています。

テンプレート目的
executable.txt引数解析機能を備えたスタンドアロンの CLI ツール
library.txtCALL で呼び出せるラベルを備えた再利用可能な関数ライブラリ
task.txtスケジュールされたタスク/自動化スクリプト

コメント