バッチファイル(.bat)と無料ツール NirCmd を組み合わせると、スクリーンショットの自動保存を簡単に実現できます。Windowsには標準でスクリーンショットをコマンドラインから撮る機能がないため、NirCmdのような外部ツールが欠かせません。
この記事では、NirCmdの導入から基本操作、日付・時刻付きファイル名での保存、全画面・アクティブウィンドウ・矩形指定の3種類の撮影方法、定期自動キャプチャ、そしてタスクスケジューラ連携まで、実務で使える応用パターンを網羅的に解説します。
この記事でわかること
- NirCmdのダウンロード・配置・動作確認
- savescreenshot / savescreenshotwin / savescreenshotrect の使い方
- 日付・時刻付きファイル名で上書き防止
- ループ+timeoutで定期キャプチャ
- tasklist連携・forfiles自動削除など応用パターン
1. NirCmdとは・導入方法
NirCmd は NirSoft が無償配布するコマンドラインユーティリティです。スクリーンショット撮影のほか、音量調整・画面解像度変更・電源操作など多彩な機能を持ちます。単一の実行ファイル(nircmd.exe)で動作するため、インストール不要で使えます。
NirCmdのダウンロードと配置
- NirSoft公式サイト(https://www.nirsoft.net/utils/nircmd.html)にアクセス
- ページ下部の「Download NirCmd」から ZIP をダウンロード
- ZIP を展開して
nircmd.exe を取り出す
- 任意の場所に配置(後述の2つの方法を参照)
注意:セキュリティソフトの誤検知
nircmd.exe はセキュリティソフトに「不審なツール」と判定されることがあります。ウイルス対策ソフトが反応した場合は、除外リストに追加するか、配置フォルダを信頼済みに設定してください。
方法①:バッチファイルと同じフォルダに置く(推奨)
最もシンプルな方法です。バッチファイルと nircmd.exe を同じフォルダに置けば、パス設定不要で使えます。
フォルダ構成
C: oolsscreenshot
├── nircmd.exe ← NirCmdの実行ファイル
├── capture.bat ← バッチファイル
└── shots ← 保存先フォルダ(自動作成)
この構成でバッチファイル内から呼び出す際は次のように書きます。
bat
@echo off
rem バッチファイルと同じフォルダのnircmd.exeを使う
set NIRCMD="%~dp0nircmd.exe"
%NIRCMD% savescreenshot "C: oolsscreenshotshots est.png"
%~dp0 は「バッチファイルが存在するドライブ+フォルダパス」を表す特殊変数です。これを使うことで、フォルダを移動しても動作し続けます。
方法②:PATH が通ったフォルダに置く
複数のバッチファイルから使い回す場合は、PATH に含まれるフォルダ(例:C:WindowsSystem32 や C: oolsin)に置くと便利です。
bat(管理者権限で実行)
rem System32 に配置(管理者権限が必要)
copy nircmd.exe C:WindowsSystem32
ircmd.exe
rem または C: oolsin を作って PATH に追加する方法
mkdir C: oolsin
copy nircmd.exe C: oolsin
ircmd.exe
rem システム環境変数 PATH に C: oolsin を追加する(setx は恒久的)
setx PATH "%PATH%;C: oolsin" /M
動作確認コマンド
配置後は次のコマンドで動作確認します。
コマンドプロンプト
rem バージョン確認
nircmd ver
rem テストスクリーンショットを保存
nircmd savescreenshot "C: est.png"
C: est.png が生成されれば導入成功です。
2. 基本のスクリーンショット保存
savescreenshot の基本構文
構文
nircmd savescreenshot "保存先ファイルパス"
最もシンプルなバッチファイルです。
bat
@echo off
rem 全画面スクリーンショットを保存する最小構成
nircmd savescreenshot "C:shotsscreen.png"
echo 保存しました: C:shotsscreen.png
保存先フォルダの自動作成
保存先フォルダが存在しない場合はエラーになります。if not exist で事前に作成しておきましょう。
bat
@echo off
set SAVEDIR=C:shots
rem フォルダがなければ作成
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
rem スクリーンショット保存
nircmd savescreenshot "%SAVEDIR%screen.png"
echo 保存完了: %SAVEDIR%screen.png
PNG / BMP / JPG の出力形式
NirCmd はファイル拡張子で出力形式を自動判定します。
| 拡張子 |
形式 |
特徴 |
用途 |
.png |
PNG |
可逆圧縮・高品質 |
テキスト含む画面など |
.bmp |
BMP |
無圧縮・ファイル大 |
後処理で変換する場合 |
.jpg |
JPEG |
非可逆・ファイル小 |
写真・動画系の画面 |
通常は .png が最もバランスよくおすすめです。
3. 日付・時刻付きファイル名で保存
DATE / TIME 変数の整形
%date% と %time% をそのままファイル名に使うと、スペースや / : などのファイル名に使えない文字が含まれます。%変数:検索=置換% 構文で整形します。
bat
@echo off
setlocal
rem %date% → 例: 2026/03/11 → 20260311 に整形
set YDATE=%date:/=%
set YDATE=%YDATE: =%
rem %time% → 例: 9:05:03.12 → スペース埋め問題に注意
set YTIME=%time::=%
set YTIME=%YTIME:.=%
set YTIME=%YTIME: =0%
set FILENAME=screenshot_%YDATE%_%YTIME%.png
set SAVEDIR=C:shots
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
nircmd savescreenshot "%SAVEDIR%\%FILENAME%"
echo 保存しました: %SAVEDIR%\%FILENAME%
endlocal
実行結果の例:
実行結果
保存しました: C:shotsscreenshot_20260311_091523456.png
TIME変数のスペース埋め(0埋め)処理の詳細
Windows の %time% は 1桁の時(午前1時〜9時)を「 9:05:03.12」のように先頭にスペースで表します。これが「 90503」という名前になり、ファイル名の先頭スペースが問題になります。
%YTIME: =0% でスペースを 0 に置換することで「090503」と0埋めされます。
ポイント:スペース置換の順番
:= と .= の置換を先に行い、最後に =0 でスペース→0置換する順番が重要です。先にスペース置換すると他の処理に影響が出る場合があります。
上書き防止のファイル命名(連番付き)
同じ秒内に複数回実行すると上書きされます。連番を付けると安全です。
bat
@echo off
setlocal enabledelayedexpansion
set SAVEDIR=C:shots
set YDATE=%date:/=%
set YDATE=%YDATE: =%
set YTIME=%time::=%
set YTIME=%YTIME:.=%
set YTIME=%YTIME: =0%
set BASE=screenshot_%YDATE%_%YTIME%
rem ファイルが存在しない連番を探す
set N=0
set OUTFILE=%SAVEDIR%\%BASE%.png
:checkloop
if exist "!OUTFILE!" (
set /a N+=1
set OUTFILE=%SAVEDIR%\%BASE%_!N!.png
goto checkloop
)
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
nircmd savescreenshot "!OUTFILE!"
echo 保存しました: !OUTFILE!
endlocal
4. 撮影範囲の指定方法
NirCmd は3種類の撮影コマンドを提供しています。
savescreenshot(全画面)
構文
nircmd savescreenshot "ファイルパス"
デスクトップ全体(マルチモニタ環境では全モニタ合計)を撮影します。
savescreenshotwin(アクティブウィンドウ)
構文
nircmd savescreenshotwin "ファイルパス"
現在フォーカスが当たっているウィンドウだけを撮影します。
bat
@echo off
rem アクティブウィンドウをキャプチャ
nircmd savescreenshotwin "C:shotsactive_window.png"
echo アクティブウィンドウを保存しました
注意:コマンドプロンプトが前面に来てしまう
バッチを直接実行すると「コマンドプロンプト」がアクティブウィンドウになります。特定アプリを撮りたい場合は、後述のタスクスケジューラ連携や start /min で最小化起動するなど工夫が必要です。
savescreenshotrect(矩形指定)
構文
nircmd savescreenshotrect "ファイルパス" X座標 Y座標 幅 高さ
画面上の指定した矩形領域を撮影します。座標は画面左上が原点(0,0)です。
bat
@echo off
rem 左上(100,50)から幅800px・高さ600pxの領域を撮影
nircmd savescreenshotrect "C:shots
egion.png" 100 50 800 600
echo 矩形領域を保存しました
rem 画面左半分(1920x1080の場合)
nircmd savescreenshotrect "C:shotsleft_half.png" 0 0 960 1080
3つのコマンド比較表
| コマンド |
撮影範囲 |
引数 |
主な用途 |
savescreenshot |
全画面 |
ファイルパスのみ |
デスクトップ全体の記録 |
savescreenshotwin |
アクティブウィンドウ |
ファイルパスのみ |
特定アプリの画面記録 |
savescreenshotrect |
指定矩形 |
パス + X Y 幅 高さ |
特定エリアの監視 |
5. 定期・自動キャプチャ
ループ + timeout で定期保存
:loop ラベルと timeout コマンドを組み合わせて、指定間隔で繰り返し撮影します。
bat
@echo off
setlocal enabledelayedexpansion
set SAVEDIR=C:shotsauto
set INTERVAL=30 rem 撮影間隔(秒)
set COUNT=0 rem 撮影枚数カウンター
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
:loop
rem 日付・時刻を整形
set YDATE=%date:/=%
set YDATE=!YDATE: =!
set YTIME=%time::=%
set YTIME=!YTIME:.=!
set YTIME=!YTIME: =0!
set /a COUNT+=1
set FNAME=screen_!COUNT!_!YDATE!_!YTIME!.png
nircmd savescreenshot "!SAVEDIR!!FNAME!"
echo [!COUNT!枚目] 保存: !FNAME!
rem 指定秒数待機(キー入力でスキップしない /nobreak)
timeout /t %INTERVAL% /nobreak >nul
goto loop
timeout のオプション
/t 秒数:待機する秒数
/nobreak:キー入力でスキップさせない(自動化に必須)
>nul:カウントダウン表示を抑制
setlocal enabledelayedexpansion の注意
ループ内で変数を更新・参照する場合は setlocal enabledelayedexpansion と !変数名! 記法が必要です。%変数名% は行の実行前に展開されるため、ループ内で更新した値が反映されません。
bat(遅延展開の比較)
@echo off
setlocal enabledelayedexpansion
set N=0
:loop
set /a N+=1
rem NG: %N% はループ開始前の値(0)のまま
echo NG: %N%
rem OK: !N! はその場で評価される最新の値
echo OK: !N!
if !N! lss 3 goto loop
保存件数・インターバルのカスタマイズ(上限付き)
一定枚数で自動停止するようにするとディスクを使いすぎません。
bat
@echo off
setlocal enabledelayedexpansion
set SAVEDIR=C:shotssession
set INTERVAL=10 rem 撮影間隔(秒)
set MAX_COUNT=20 rem 最大撮影枚数
set COUNT=0
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
echo キャプチャ開始: 最大 %MAX_COUNT% 枚、間隔 %INTERVAL% 秒
:loop
set /a COUNT+=1
if !COUNT! gtr %MAX_COUNT% (
echo 上限枚数に達しました。終了します。
goto :eof
)
set YDATE=%date:/=%
set YDATE=!YDATE: =!
set YTIME=%time::=%
set YTIME=!YTIME:.=!
set YTIME=!YTIME: =0!
nircmd savescreenshot "!SAVEDIR!!COUNT!_!YDATE!_!YTIME!.png"
echo [!COUNT!/%MAX_COUNT%] 保存完了
timeout /t %INTERVAL% /nobreak >nul
goto loop
タスクスケジューラとの組み合わせ
タスクスケジューラでバッチを定期実行すれば、完全な自動化が実現します。ループが不要になり、シンプルなバッチになります。
bat(タスクスケジューラ用・1枚撮影して終了)
@echo off
setlocal
set SAVEDIR=C:shotsscheduled
set YDATE=%date:/=%
set YDATE=%YDATE: =%
set YTIME=%time::=%
set YTIME=%YTIME:.=%
set YTIME=%YTIME: =0%
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
nircmd savescreenshot "%SAVEDIR%screen_%YDATE%_%YTIME%.png"
endlocal
タスクスケジューラの設定手順:
- 「タスクスケジューラ」を開く(スタートメニューで検索)
- 「タスクの作成」をクリック
- 「全般」タブ:タスク名を入力(例:「スクリーンショット自動保存」)
- 「トリガー」タブ:「新規」→ 繰り返し間隔を設定(例:毎日・毎時など)
- 「操作」タブ:「プログラムの開始」→ バッチファイルのパスを指定
- 「条件」タブ:「AC電源接続時のみ」などを必要に応じて設定
ポイント:タスクスケジューラはバックグラウンド実行
タスクスケジューラから実行する場合、コマンドプロンプトウィンドウは表示されません。savescreenshotwin を使う場合はデスクトップにフォーカスが当たっているアプリが撮影されます。
6. 応用パターン
特定ウィンドウが開いたときだけ撮影(tasklist連携)
tasklist コマンドでプロセス一覧を取得し、特定のプロセスが起動しているときだけ撮影するパターンです。
bat
@echo off
setlocal enabledelayedexpansion
set TARGET_PROCESS=chrome.exe rem 監視対象プロセス名
set SAVEDIR=C:shotschrome
set INTERVAL=60 rem チェック間隔(秒)
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
:checkloop
rem プロセスが存在するか確認
tasklist /fi "imagename eq %TARGET_PROCESS%" 2>nul | find /i "%TARGET_PROCESS%" >nul
if %errorlevel% equ 0 (
rem プロセスが起動中 → スクリーンショット撮影
set YDATE=%date:/=%
set YDATE=!YDATE: =!
set YTIME=%time::=%
set YTIME=!YTIME:.=!
set YTIME=!YTIME: =0!
nircmd savescreenshot "!SAVEDIR!chrome_!YDATE!_!YTIME!.png"
echo [%TARGET_PROCESS% 検出] 保存しました
) else (
echo [%TARGET_PROCESS%] は起動していません
)
timeout /t %INTERVAL% /nobreak >nul
goto checkloop
古いファイルを自動削除(forfiles)
定期撮影でファイルが増え続けないよう、forfiles で一定日数より古いファイルを自動削除します。
bat
@echo off
set SAVEDIR=C:shotsauto
set KEEP_DAYS=7 rem 何日分残すか
rem スクリーンショット撮影
set YDATE=%date:/=%
set YDATE=%YDATE: =%
set YTIME=%time::=%
set YTIME=%YTIME:.=%
set YTIME=%YTIME: =0%
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
nircmd savescreenshot "%SAVEDIR%screen_%YDATE%_%YTIME%.png"
rem 指定日数より古いPNGファイルを削除
forfiles /p "%SAVEDIR%" /s /m *.png /d -%KEEP_DAYS% /c "cmd /c del @path" 2>nul
echo %KEEP_DAYS%日より古いファイルを削除しました
forfiles /d -7 は「7日より前に更新されたファイル」を対象にします。2>nul で「対象ファイルなし」のエラーを抑制しています。
キャプチャ後にメール送信(blat併用)
blat(コマンドラインメール送信ツール)と組み合わせると、撮影した画像をメール添付で送れます。
bat(blat導入・設定済みの場合)
@echo off
setlocal
set SAVEDIR=C:shotsalert
set MAILTO=admin@example.com
set YDATE=%date:/=%
set YDATE=%YDATE: =%
set YTIME=%time::=%
set YTIME=%YTIME:.=%
set YTIME=%YTIME: =0%
set IMGFILE=%SAVEDIR%alert_%YDATE%_%YTIME%.png
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
rem スクリーンショット保存
nircmd savescreenshot "%IMGFILE%"
rem blatでメール送信(SMTPサーバー設定済みが前提)
blat -to %MAILTO% -subject "[自動通知] スクリーンショット %YDATE%_%YTIME%" -body "スクリーンショットを添付します" -attach "%IMGFILE%"
echo メールを送信しました: %MAILTO%
endlocal
フォルダ監視と組み合わせた自動化
特定フォルダにファイルが追加されたタイミングでスクリーンショットを撮るパターンです。dir /b で件数を比較してファイル追加を検知します。
bat
@echo off
setlocal enabledelayedexpansion
set WATCH_DIR=C:incoming rem 監視フォルダ
set SAVEDIR=C:shots rigger
set PREV_COUNT=0
if not exist "%SAVEDIR%" mkdir "%SAVEDIR%"
rem 初期カウント取得
for /f "delims=" %%i in ('dir /b "%WATCH_DIR%" 2^>nul | find /c /v ""') do set PREV_COUNT=%%i
:watchloop
for /f "delims=" %%i in ('dir /b "%WATCH_DIR%" 2^>nul | find /c /v ""') do set CURR_COUNT=%%i
if !CURR_COUNT! gtr !PREV_COUNT! (
echo ファイル追加を検知しました (!PREV_COUNT! → !CURR_COUNT!)
set YDATE=%date:/=%
set YDATE=!YDATE: =!
set YTIME=%time::=%
set YTIME=!YTIME:.=!
set YTIME=!YTIME: =0!
nircmd savescreenshot "!SAVEDIR! rigger_!YDATE!_!YTIME!.png"
set PREV_COUNT=!CURR_COUNT!
)
timeout /t 5 /nobreak >nul
goto watchloop
7. よくあるミスと注意点
① nircmd.exe のパスが通っていない
症状:'nircmd' は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
原因:nircmd.exe が PATH の通っていないフォルダにある、またはファイルが存在しない。
対処:
bat
@echo off
rem バッチと同じフォルダのnircmd.exeを使う(推奨)
set NIRCMD="%~dp0nircmd.exe"
if not exist %NIRCMD% (
echo エラー: nircmd.exe が見つかりません: %~dp0nircmd.exe
pause
exit /b 1
)
%NIRCMD% savescreenshot "C:shots est.png"
② ファイル名の半角スペース問題
症状:保存先パスにスペースが含まれていると保存に失敗する。
対処:ファイルパスは必ずダブルクォートで囲む。
bat
rem NG: スペースを含むパスがあると失敗する
nircmd savescreenshot C:My Shots est.png
rem OK: ダブルクォートで囲む
nircmd savescreenshot "C:My Shots est.png"
③ 遅延展開が必要なケース
症状:ループ内で %変数% を使っているが、値が更新されない。
原因:%変数% はコマンドブロック実行前に展開されるため、ループ内で更新した値が反映されない。
対処:setlocal enabledelayedexpansion と !変数! を使う(「5. 定期・自動キャプチャ」参照)。
④ マルチモニタ環境での注意
savescreenshot はすべてのモニタを結合した画像を保存します。特定のモニタだけを撮りたい場合は savescreenshotrect で座標・サイズを指定します。
bat(デュアルモニタの左側モニタのみ撮影 / 各1920×1080の場合)
rem 左モニタ(0,0 から幅1920・高さ1080)
nircmd savescreenshotrect "C:shotsmonitor1.png" 0 0 1920 1080
rem 右モニタ(1920,0 から幅1920・高さ1080)
nircmd savescreenshotrect "C:shotsmonitor2.png" 1920 0 1920 1080
⑤ セキュリティソフトによる誤検知への対処
nircmd.exe は正規の無料ツールですが、画面操作・音量変更・電源操作など多機能なため、セキュリティソフトが「危険なツール」と判定することがあります。
| 対処方法 |
手順 |
| 除外リストに追加 |
セキュリティソフトの設定でnircmd.exeを「信頼済み」に登録 |
| フォルダを信頼済みに |
nircmd.exeを置いたフォルダをスキャン除外に設定 |
| Windows Defenderの場合 |
「ウイルスと脅威の防止」→「除外の追加または削除」で追加 |
⑥ 保存先フォルダのドライブ容量に注意
高頻度で撮影するとファイルがすぐに数GBに達します。forfiles による自動削除(「6. 応用パターン」参照)やSSDの空き容量の定期確認を組み合わせることをおすすめします。
8. まとめ(コマンド早見表)
この記事で紹介したコマンドをまとめます。
| コマンド |
用途 |
書き方例 |
savescreenshot |
全画面キャプチャ |
nircmd savescreenshot "out.png" |
savescreenshotwin |
アクティブウィンドウ |
nircmd savescreenshotwin "win.png" |
savescreenshotrect |
矩形指定 |
nircmd savescreenshotrect "r.png" 0 0 800 600 |
if not exist mkdir |
フォルダ自動作成 |
if not exist "%DIR%" mkdir "%DIR%" |
%date:/=% |
日付の整形 |
set D=%date:/=% → 20260311 |
%time: =0% |
時刻0埋め |
set T=%T: =0% → 091523456 |
timeout /t N /nobreak |
待機 |
timeout /t 30 /nobreak >nul |
tasklist /fi |
プロセス確認 |
tasklist /fi "imagename eq chrome.exe" |
forfiles /d -N |
古いファイル削除 |
forfiles /p "%DIR%" /m *.png /d -7 /c "cmd /c del @path" |
バッチファイル+NirCmdの組み合わせは、インストール不要・軽量・柔軟な自動化が実現できる強力な手段です。タスクスケジューラとの連携で完全自動化し、forfilesでのディスク管理も加えれば、運用面でも安心なスクリーンショット自動保存システムが構築できます。