【bat】SFC・DISMの使い方|scannow・Windows修復

【bat】SFC・DISMコマンド完全ガイド|Windowsファイル修復・整合性チェックをバッチで自動化・定期ヘルスチェック bat

sfc /scannowDISM /Online /Cleanup-Image /RestoreHealth は、Windowsのシステムファイル破損やコンポーネントストア不具合を確認・修復する標準コマンドです。bat化すると、管理者権限チェック、ログ保存、SFC→DISM→SFCの再実行、定期ヘルスチェックを自動化できます。

この記事では、まず実行順序とコマンドを早見表で整理し、そのあとにSFCのログ確認、DISMの修復、タスクスケジューラでの定期実行、直らない場合の切り分けまで実務向けに解説します。

先に結論:基本順序は sfc /scannow → 失敗したら DISM /Online /Cleanup-Image /RestoreHealth → もう一度 sfc /scannow です。どちらも管理者権限で実行してください。

スポンサーリンク

SFC・DISMでよく使うコマンド早見表

目的 コマンド 目安
システムファイルを確認・修復 sfc /scannow まず最初に実行
修復せず確認だけ sfc /verifyonly 定期チェック向き
コンポーネントストアを簡易確認 DISM /Online /Cleanup-Image /CheckHealth 数秒から1分
コンポーネントストアを詳細確認 DISM /Online /Cleanup-Image /ScanHealth 数分から15分程度
Windowsイメージを修復 DISM /Online /Cleanup-Image /RestoreHealth 30分以上かかることあり
不要コンポーネントを削除 DISM /Online /Cleanup-Image /StartComponentCleanup 容量節約
SFCログを確認 findstr /c:"[SR]" CBS.log 修復結果の確認
定期実行する schtasks /create ... 週次・月次チェック
SFC→DISM→SFCの最小テンプレート
@echo off
setlocal

net session >nul 2>&1
if errorlevel 1 (
    echo 管理者権限で実行してください。
    exit /b 1
)

sfc /scannow
if errorlevel 1 (
    DISM /Online /Cleanup-Image /RestoreHealth
    sfc /scannow
)

exit /b %ERRORLEVEL%

目的別ショートカット

やりたいこと 読む場所 主なコマンド
まず実行順序だけ知りたい コマンド早見表 sfcDISM
SFCとDISMの違いを知りたい SFCとDISMの違い 修復対象の違い
sfc /scannow をbat化したい SFCの基本 sfc /scannow
SFCログを確認したい CBS.logを解析 findstr "[SR]"
DISMでWindowsを修復したい DISMの基本 RestoreHealth
定期ヘルスチェックしたい 定期ヘルスチェック schtasks
直らない場合の次手を知りたい 直らない場合 ログ / 権限 / ディスク

SFCとDISMの違い・使い分け

SFCとDISMはどちらもWindowsの修復ツールですが、対象とする範囲と仕組みが大きく異なります。

項目 SFC(System File Checker) DISM
修復対象 Windowsシステムファイル(System32など) Windowsイメージ(コンポーネントストア)
修復ソース ローカルのコンポーネントストア(WinSxS) Windows Update・ネット・インストールメディア
実行時間 10〜30分程度 CheckHealth: 数秒、RestoreHealth: 30分〜1時間以上
ログファイル C:\Windows\Logs\CBS\CBS.log C:\Windows\Logs\DISM\dism.log
管理者権限 必要 必要
インターネット 不要(ローカル修復) RestoreHealthは基本的に必要(オフライン指定も可)
推奨実行順序
SFCで修復失敗 → DISMでストア修復 → SFC再実行が基本フローです。
SFCはコンポーネントストア(WinSxS)からファイルを復元しますが、そのストア自体が壊れていると修復できません。DISMはストア自体をWindowsUpdateから修復するため、まずDISMでストアを健全にしてからSFCを実行するのが最も確実です。

SFC(sfc /scannow)の基本

主なオプション一覧

オプション 内容
sfc /scannow すべての保護されたシステムファイルをスキャンし、破損を修復する
sfc /verifyonly スキャンのみ実行(修復はしない)。バッチ定期実行に最適
sfc /scanfile=パス 指定ファイルだけをスキャン・修復
sfc /verifyfile=パス 指定ファイルの整合性確認のみ(修復なし)
sfc /offbootdir=D:\ /offwindir=D:\Windows 起動できないPCのWindowsをオフラインでスキャン

SFCの終了コードと意味

SFCの%errorlevel%は信頼性が低いため、CBS.logも必ず確認してください。

ERRORLEVEL 意味 次のアクション
0 問題なし(整合性違反は見つからなかった) 対応不要
1 破損ファイルが見つかり修復に成功した 再起動推奨
2 破損ファイルが見つかったが修復に失敗した DISMでストア修復後に再実行
3 実行に失敗(権限不足・別のSFCが実行中など) 管理者権限を確認
SFCの同時実行制限
SFCは1度に1つしか実行できません。複数のバッチから同時に起動しようとすると「Windows Resource Protection が要求された操作を実行できませんでした」というエラーになります。複数PCへの一括展開時は各PCで1プロセスのみ実行されるよう制御してください。
sfc_basic.bat
@echo off
:: SFCの基本実行(管理者権限が必要)
sfc /scannow
echo.
echo 終了コード: %errorlevel%
pause

特定ファイルのスキャン・修復

sfc_scanfile.bat
@echo off
:: 特定のシステムファイルだけをスキャン・修復する
set TARGET_FILE=C:\Windows\System32\notepad.exe

:: まず整合性確認だけ
sfc /verifyfile="%TARGET_FILE%"
echo verifyfile 終了コード: %errorlevel%

:: 問題があれば修復
if %errorlevel% neq 0 (
    sfc /scanfile="%TARGET_FILE%"
    echo scanfile 終了コード: %errorlevel%
)
管理者権限について
SFCとDISMは管理者権限なしでは実行できません。バッチファイルで管理者権限を自動取得する方法と組み合わせることで、ダブルクリックで自動昇格させることができます。

SFCのログ(CBS.log)を解析する

SFCの詳細な結果はC:\Windows\Logs\CBS\CBS.logに記録されています。このファイルは長期使用で数十MB以上になることがあり、SFC関連のエントリだけを抽出する必要があります。

CBS.log の自動アーカイブについて

CBS.logが一定サイズを超えると、Windowsは自動的にCbsPersist_YYYYMMDD_hhmmss.cab形式でC:\Windows\Logs\CBS\フォルダにアーカイブします。不要なアーカイブを削除してディスクを節約したい場合はCbsPersist_*.cabファイルを削除できます。

sfc_log_check.bat
@echo off
:: CBS.logからSFC関連のエラーエントリを抽出して保存
:: ログが文字化けする場合は chcp 65001 を先頭に追加
set LOG_SRC=C:\Windows\Logs\CBS\CBS.log
set LOG_OUT=C:\logs\sfc_result_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
if not exist C:\logs mkdir C:\logs

(
    echo === SFC ログ解析 ===
    echo 日時: %DATE% %TIME%
    echo.
) > "%LOG_OUT%"

:: "[SR]" タグがSFCのエントリ
findstr /c:"[SR]" "%LOG_SRC%" | findstr /i ^^
    "cannot repair\|found corrupt\|repaired successfully\|verify complete\|unable to fix" ^^
    >> "%LOG_OUT%" 2>&1

echo SFCログを抽出しました: %LOG_OUT%
type "%LOG_OUT%"

CBS.logのSFC関連エントリは[SR]タグで始まります。代表的なメッセージの意味は以下の通りです。

ログメッセージ 意味
Verify complete スキャン完了(問題なし)
did not find any integrity violations 整合性違反なし(正常)
found corrupt files and successfully repaired them 破損ファイルを発見して修復済み
found corrupt files but was unable to fix some of them 修復できなかったファイルあり → DISMが必要
Cannot repair member file 特定ファイルを修復できなかった

DISM(Windowsイメージ修復)の基本

DISMはWindowsイメージとコンポーネントストア(WinSxSフォルダ)の管理ツールです。Windows Server向けのイメージ展開ツールとして開発されましたが、Windows 8以降は一般ユーザーのシステム修復にも広く使われています。

修復系オプション(実行順序の目安)

コマンド 内容 所要時間
DISM /Online /Cleanup-Image /CheckHealth コンポーネントストアが破損しているかを簡易チェック(修復は不可) 数秒〜1分
DISM /Online /Cleanup-Image /ScanHealth コンポーネントストアを詳細スキャン(修復は不可) 5〜15分
DISM /Online /Cleanup-Image /RestoreHealth コンポーネントストアをWindowsUpdateから修復(インターネット必要) 30分〜1時間以上
DISM /Online /Cleanup-Image /StartComponentCleanup 不要コンポーネントを削除してディスク容量を回収 10〜30分

インターネットなしでDISMを実行する(ソース指定)

インターネット接続がない環境や、Windows Updateが壊れている場合は、インストールメディア(USBやISO)をソースとして指定できます。

dism_offline_source.bat
@echo off
:: Dドライブにマウントしたインストールメディアをソースとして指定
set SOURCE=D:\sources\install.wim

DISM /Online /Cleanup-Image /RestoreHealth /Source:wim:"%SOURCE%":1 /LimitAccess

:: /LimitAccess: Windows Updateへのアクセスを制限し、指定ソースのみを使用
:: インデックス番号1はHomeエディション(install.wimの構成による)
:: インデックス番号を確認するには:
::   DISM /Get-ImageInfo /ImageFile:D:\sources\install.wim

DISMの終了コード

ERRORLEVEL 意味
0 成功(エラーなし)
1 エラーが発生した
11 ソースファイルが見つからない
50 指定されたオプションが無効
87 パラメーターが無効
3010 再起動が必要(修復自体は成功)

Windowsオプション機能の確認・追加・削除

DISMはシステム修復だけでなく、Windowsのオプション機能(Internet Explorer・.NET Frameworkなど)の管理にも使えます。

dism_features.bat
@echo off
:: Windowsのオプション機能一覧を確認
DISM /Online /Get-Features /Format:Table

:: 特定機能の状態確認(例: .NET Framework 3.5)
DISM /Online /Get-FeatureInfo /FeatureName:NetFx3

:: .NET Framework 3.5 を有効化(インターネット接続が必要)
:: DISM /Online /Enable-Feature /FeatureName:NetFx3 /All

:: .NET Framework 3.5 を無効化
:: DISM /Online /Disable-Feature /FeatureName:NetFx3

SFC→DISM 自動修復フロー

「SFCで修復失敗 → DISMでストア修復 → SFC再実行」のフローを完全自動化したスクリプトです。修復結果はログに記録され、問題があれば通知します。

sfc_dism_auto_repair.bat
@echo off
setlocal enabledelayedexpansion

:: ========================================
::  SFC + DISM 自動修復スクリプト
::  管理者権限で実行すること
:: ========================================
set LOG_DIR=C:\logs\sfc_dism
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set LOG=%LOG_DIR%\repair_%COMPUTERNAME%_%DATE_STR%.txt
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

call :log "=== Windows修復スクリプト開始 ==="
call :log "PC: %COMPUTERNAME% / User: %USERNAME%"
call :log "日時: %DATE% %TIME%"

:: ---- STEP1: SFC 実行 ----
call :log ""
call :log "[STEP1] sfc /scannow 実行中...(10〜30分かかります)"
sfc /scannow >> "%LOG%" 2>&1
set SFC1_CODE=%errorlevel%
call :log "[STEP1] 終了コード: %SFC1_CODE%"

:: ---- STEP2: CBS.logで修復失敗を確認 ----
set NEED_DISM=0
findstr /c:"unable to fix" C:\Windows\Logs\CBS\CBS.log >nul 2>&1
if !errorlevel! equ 0 set NEED_DISM=1

if "%NEED_DISM%"=="0" (
    call :log "[INFO] SFCで問題なし。DISMは不要です。"
    goto :done
)

call :log "[STEP2] SFCで修復できなかったファイルあり。DISMを実行します。"

:: ---- STEP3: DISM RestoreHealth ----
call :log "[STEP2] DISM /RestoreHealth 実行中...(30分〜1時間かかります)"
DISM /Online /Cleanup-Image /RestoreHealth >> "%LOG%" 2>&1
set DISM_CODE=!errorlevel!
call :log "[STEP2] DISM 終了コード: !DISM_CODE!"

if !DISM_CODE! neq 0 (
    call :log "[ERROR] DISMが失敗しました。ネット接続またはソース指定を確認してください。"
    goto :done
)

:: ---- STEP4: SFC再実行 ----
call :log ""
call :log "[STEP3] DISM成功。sfc /scannow を再実行中..."
sfc /scannow >> "%LOG%" 2>&1
call :log "[STEP3] SFC再実行 終了コード: !errorlevel!"

:: 再起動が必要かチェック
findstr /c:"reboot" "%LOG%" >nul 2>&1
if !errorlevel! equ 0 (
    call :log "[INFO] 修復完了。再起動が推奨されます。"
)

:done
call :log ""
call :log "=== 修復スクリプト終了: %DATE% %TIME% ==="
echo 完了。ログ: %LOG%
exit /b 0

:log
echo %~1
echo %~1 >> "%LOG%"
goto :eof

定期ヘルスチェックスクリプト

週次でWindows健康状態を確認し、問題があればログに記録します。タスクスケジューラで毎週日曜の夜中に実行するよう登録すれば日常的なPC管理が自動化できます。

weekly_health_check.bat
@echo off
setlocal

set LOG_DIR=C:\logs\health
set DATE_STR=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%
set LOG=%LOG_DIR%\health_%COMPUTERNAME%_%DATE_STR%.txt
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

(
    echo === Windowsヘルスチェック ===
    echo PC: %COMPUTERNAME%
    echo 日時: %DATE% %TIME%
    echo.
) > "%LOG%"

:: DISM CheckHealth(簡易・数秒)
echo [DISM CheckHealth] >> "%LOG%"
DISM /Online /Cleanup-Image /CheckHealth >> "%LOG%" 2>&1
echo 終了コード: %errorlevel% >> "%LOG%"
echo. >> "%LOG%"

:: SFC verifyonly(確認のみ・修復なし・10〜20分)
echo [SFC verifyonly] >> "%LOG%"
sfc /verifyonly >> "%LOG%" 2>&1
echo 終了コード: %errorlevel% >> "%LOG%"

:: 問題の有無をチェック
set STATUS=OK
findstr /i "corrupt\|unable to fix\|cannot repair" "%LOG%" >nul 2>&1
if %errorlevel% equ 0 set STATUS=NG

echo. >> "%LOG%"
if "%STATUS%"=="OK" (
    echo [結果: 正常] >> "%LOG%"
    echo 正常: 問題は検出されませんでした。
) else (
    echo [結果: 要対応] sfc_dism_auto_repair.bat の実行を推奨します。 >> "%LOG%"
    echo 警告: 問題が検出されました。%LOG% を確認してください。
)

タスクスケジューラへの登録

register_health_check.bat
@echo off
:: 毎週日曜 23:00 にヘルスチェックを実行
set SCRIPT=%~dp0weekly_health_check.bat

schtasks /create /tn "WindowsHealthCheck" ^^
    /tr "cmd /c \"%SCRIPT%\"" ^^
    /sc WEEKLY /d SUN /st 23:00 ^^
    /ru SYSTEM ^^
    /f

if %errorlevel% equ 0 (
    echo タスク「WindowsHealthCheck」を登録しました
) else (
    echo 登録失敗(管理者権限で実行してください)
)

コンポーネントストアのクリーンアップ(容量節約)

DISMのクリーンアップでWindows Update後に残った古いコンポーネントを削除してディスク容量を回収できます。C:\Windowsフォルダが肥大化している場合に有効です。

dism_cleanup.bat
@echo off
echo コンポーネントストアのクリーンアップを実行します...
echo (完了まで10〜30分かかる場合があります)

:: 基本クリーンアップ(安全・可逆)
DISM /Online /Cleanup-Image /StartComponentCleanup
if %errorlevel% neq 0 goto :error

echo クリーンアップ完了しました。
echo.

:: コンポーネントストアの現在サイズを確認
DISM /Online /Cleanup-Image /AnalyzeComponentStore
goto :eof

:error
echo エラーが発生しました(終了コード: %errorlevel%)
echo C:\Windows\Logs\DISM\dism.log を確認してください
/ResetBase オプションについて
DISM /Online /Cleanup-Image /StartComponentCleanup /ResetBaseでさらに多くの容量を回収できますが、実行後は対応するWindowsUpdateのアンインストールができなくなります。問題発生時に前の状態に戻せなくなるため、安定稼働が確認できた環境のみに使用してください。

起動できないPCのオフライン修復

Windowsが起動できない状態でシステムファイルを修復する方法です。Windows回復環境(WinRE)またはインストールメディアから起動してコマンドプロンプトを開いて実行します。

sfc_offline.bat
:: WinREまたはインストールメディアのコマンドプロンプトから実行

:: まずどのドライブに対象のWindowsがあるか確認
diskpart
:: diskpart内で: list volume
:: Windowsが入っているドライブ文字を確認する(例: D:)

:: オフラインSFC(例: 対象WindowsがD:\Windows の場合)
sfc /scannow /offbootdir=D:\ /offwindir=D:\Windows

:: オフラインDISM RestoreHealth
DISM /Image:D:\ /Cleanup-Image /RestoreHealth

:: オフラインDISMでソースを指定する場合(インストールメディアのE:\sources\install.wim)
:: DISM /Image:D:\ /Cleanup-Image /RestoreHealth /Source:wim:E:\sources\install.wim:1 /LimitAccess
Windows回復環境(WinRE)の起動方法
正常に起動できる場合: 設定 → システム → 回復 → 「PCの起動をカスタマイズする」→「今すぐ再起動」
起動できない場合: 電源ボタンを使って3回連続で強制終了すると「自動修復」画面が表示され、コマンドプロンプトを選択できます。
インストールメディアを使う場合: USBインストールメディアから起動 → 「コンピューターを修復する」→「コマンドプロンプト」

SFC/DISMで直らない場合のチェックリスト

SFCとDISMを実行しても問題が解決しない場合、原因がシステムファイル以外にある可能性があります。

確認する問題 コマンド 内容
HDDの不良セクター chkdsk C: /f /r ディスクの論理エラー・不良セクターを修復(再起動後に実行)
メモリ不良 mdsched.exe Windowsメモリ診断ツールを起動(再起動後に検査)
ドライバー問題 verifier.exe ドライバー検証ツール(BSoD原因の特定)
ウイルス・マルウェア MpCmdRun.exe -Scan -ScanType 2 Windows Defenderのフルスキャン(コマンドライン版)
ハードウェア故障 wmic diskdrive get status ディスクのS.M.A.R.T.ステータス確認
full_repair_flow.bat
@echo off
setlocal
echo ============================================
echo  Windows総合修復フロー
echo ============================================
echo.

:: 1. DISM でストアを健全化
echo [1/3] DISM RestoreHealth 実行中...
DISM /Online /Cleanup-Image /RestoreHealth
if %errorlevel% neq 0 (
    echo [警告] DISM失敗(コード: %errorlevel%)。継続します...
)

:: 2. SFC で修復
echo.
echo [2/3] SFC scannow 実行中...
sfc /scannow
echo SFC 終了コード: %errorlevel%

:: 3. Windows Defender クイックスキャン
echo.
echo [3/3] Windows Defender スキャン実行中...
set DEFENDER="C:\Program Files\Windows Defender\MpCmdRun.exe"
if exist %DEFENDER% (
    %DEFENDER% -Scan -ScanType 1
    echo Defender 終了コード: %errorlevel%
) else (
    echo Windows Defenderが見つかりません。
)

echo.
echo 総合修復フロー完了。PCを再起動することを推奨します。
set /p REBOOT=今すぐ再起動しますか? [y/N]: 
if /i "%REBOOT%"=="y" shutdown /r /t 60 /c "修復完了のため再起動します。60秒後に自動再起動。"

実践パターン

パターン1: 問題検出時にメール通知

ヘルスチェックで問題が検出された場合にエラー通知を送るパターンです。無人サーバー管理に有効です。

health_check_notify.bat
@echo off
setlocal
set LOG=C:\logs\health_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
if not exist C:\logs mkdir C:\logs

DISM /Online /Cleanup-Image /CheckHealth > "%LOG%" 2>&1
sfc /verifyonly >> "%LOG%" 2>&1

set STATUS=OK
findstr /i "corrupt\|unable to fix\|error" "%LOG%" >nul 2>&1
if %errorlevel% equ 0 set STATUS=NG

if "%STATUS%"=="NG" (
    echo [警告] %COMPUTERNAME% でWindowsファイル破損が検出されました。
    :: PowerShellでメール送信(SMTPサーバーを設定して使用)
    powershell -Command "^
        \$smtp = New-Object Net.Mail.SmtpClient('smtp.example.com', 587);^
        \$smtp.Credentials = New-Object Net.NetworkCredential('user@example.com','password');^
        \$smtp.EnableSsl = \$true;^
        \$smtp.Send('user@example.com','admin@example.com',^
        '[警告] %COMPUTERNAME% Windowsファイル破損検出',^
        (Get-Content '%LOG%' -Raw));"
    echo 管理者にメール送信しました。
)

パターン2: 週次修復レポートCSV生成

複数PCのヘルスチェック結果をCSVにまとめて、Excelで一覧管理するパターンです。

health_report_csv.bat
@echo off
setlocal
set CSV=C:\logs\health_report_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.csv
if not exist C:\logs mkdir C:\logs

:: ヘッダー行
echo PC名,日時,DISM結果,SFC結果,判定 > "%CSV%"

:: DISM CheckHealth
set DISM_TMP=%TEMP%\dism_tmp.txt
DISM /Online /Cleanup-Image /CheckHealth > "%DISM_TMP%" 2>&1
set DISM_CODE=%errorlevel%
if %DISM_CODE% equ 0 (set DISM_RESULT=OK) else (set DISM_RESULT=NG[%DISM_CODE%])

:: SFC verifyonly
set SFC_TMP=%TEMP%\sfc_tmp.txt
sfc /verifyonly > "%SFC_TMP%" 2>&1
set SFC_CODE=%errorlevel%
set SFC_DETAIL=OK
findstr /c:"unable to fix" "%SFC_TMP%" >nul 2>&1
if %errorlevel% equ 0 set SFC_DETAIL=要修復

:: 総合判定
set OVERALL=正常
if not "%DISM_RESULT%"=="OK" set OVERALL=要対応
if "%SFC_DETAIL%"=="要修復" set OVERALL=要対応

echo %COMPUTERNAME%,%DATE% %TIME%,%DISM_RESULT%,%SFC_DETAIL%,%OVERALL% >> "%CSV%"

del "%DISM_TMP%" "%SFC_TMP%" 2>nul
echo レポート: %CSV%
type "%CSV%"

パターン3: 定期的なDISMクリーンアップ(月次)

月次でコンポーネントストアをクリーンアップしてディスク容量を維持するパターンです。タスクスケジューラで月初に自動実行します。

monthly_dism_cleanup.bat
@echo off
setlocal
set LOG=C:\logs\dism_cleanup_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.txt
if not exist C:\logs mkdir C:\logs

:: 実行前のサイズ確認
echo === DISM月次クリーンアップ === > "%LOG%"
echo 実行前コンポーネントストア分析: >> "%LOG%"
DISM /Online /Cleanup-Image /AnalyzeComponentStore >> "%LOG%" 2>&1

:: クリーンアップ実行
echo クリーンアップ中... >> "%LOG%"
DISM /Online /Cleanup-Image /StartComponentCleanup >> "%LOG%" 2>&1

:: 実行後の確認
echo 実行後コンポーネントストア分析: >> "%LOG%"
DISM /Online /Cleanup-Image /AnalyzeComponentStore >> "%LOG%" 2>&1

echo クリーンアップ完了: %LOG%
register_monthly_cleanup.bat
@echo off
:: 毎月1日 02:00 にDISMクリーンアップを実行
set SCRIPT=%~dp0monthly_dism_cleanup.bat

schtasks /create /tn "DISMMonthlyCleanup" ^^
    /tr "cmd /c \"%SCRIPT%\"" ^^
    /sc MONTHLY /d 1 /st 02:00 ^^
    /ru SYSTEM /f

echo タスク「DISMMonthlyCleanup」を登録しました

Windows 11 / Windows 10 での注意点

項目 内容
DISM RestoreHealth の速度 インターネット回線速度やWindows Updateサーバーの混雑状況で大幅に変わる。2時間以上かかることもある
SFC の文字化け対策 chcp 65001(UTF-8)をバッチ先頭に追加するか、ログファイルに出力して確認する
SFC の進捗表示 対話的な%表示はバッチ出力時には表示されない。ファイルへのリダイレクトも同様
WinPE環境での注意 起動中のOSのファイルはロックされているため修復できない場合がある。/offbootdir /offwindirオプションで別ドライブを指定する
DISM.log の場所 C:\Windows\Logs\DISM\dism.log。詳細はWindowsイベントビューアーのDISMチャンネルでも確認できる
CBS.log のアーカイブ 一定サイズを超えるとCbsPersist_*.cabとして同フォルダに圧縮保存される。不要なら削除可

よくあるエラーと対処

エラー・症状 原因 対処
「Windows リソース保護は要求された操作を実行できませんでした」 管理者権限なし・または別のSFCが実行中 管理者として実行する。実行中のSFCがあれば完了を待つ
SFCがEXITCODE=0だが問題が修復されていない SFCの終了コードは信頼性が低い CBS.logを確認して「cannot repair」や「unable to fix」を検索する
DISM RestoreHealthが「ソースファイルが見つかりませんでした」 インターネット未接続またはWindows Update接続に問題あり インターネット接続を確認。接続できない場合はインストールメディアを/Sourceで指定する
DISM RestoreHealthが長時間「100%」で停止している 通常の動作(大量のダウンロード中) DISM.logを確認して処理が進んでいるか確認する。2時間以上変化がない場合のみ強制終了を検討
「次の再起動時に修復します」と表示される ロック中のファイルがあり再起動後に修復が必要 PCを再起動すると次回起動時に自動で修復が実行される
バッチ実行時にSFCの進捗(%表示)が表示されない バッチのリダイレクト出力ではプログレスバーは表示されない 正常な動作。ログファイルに結果は書き込まれている

あわせて確認したい関連記事

よくある質問

QSFCとDISMはどちらを先に実行しますか?
A基本は sfc /scannow を先に実行します。SFCで修復できない場合は DISM /Online /Cleanup-Image /RestoreHealth を実行し、最後にもう一度SFCを実行します。
Qsfc /scannowをbatで実行できますか?
Aできます。ただし管理者権限が必要です。bat冒頭で net session による権限チェックを入れ、権限不足なら中断する形にすると安全です。
QDISM RestoreHealthは何を修復しますか?
AWindowsのコンポーネントストアを修復します。SFCが参照する修復元そのものを直すため、SFCで「修復できませんでした」と出る場合の次手になります。
QDISMはインターネット接続が必要ですか?
ARestoreHealth は通常Windows Updateを修復ソースにするため、接続が必要です。オフライン環境では /Source/LimitAccess でインストールメディアを指定します。
QSFCの結果ログはどこにありますか?
AC:\Windows\Logs\CBS\CBS.log です。findstr /c:"[SR]" CBS.log でSFC関連の行だけ抽出できます。
QDISMが0%や62.3%で止まったように見えます。
ADISMは一定時間同じ進捗率に見えることがあります。数十分単位で待つ必要があるため、CPUやディスクI/Oが動いている間は強制終了しないでください。
Qタスクスケジューラで定期実行してもよいですか?
A可能ですが、sfc /verifyonlyDISM /CheckHealth のような軽い確認を定期実行し、重い RestoreHealth は異常時だけ実行する設計が扱いやすいです。
QSFC/DISMで直らない場合はどうしますか?
ACBS.logとDISM.logを確認し、ディスク不良、Windows Update不調、ドライバ、マルウェア、ストレージ空き容量を切り分けます。それでも改善しない場合はインプレース修復やバックアップからの復元を検討します。

まとめ

SFCとDISMをバッチファイルと組み合わせることで、Windowsの健康状態監視から修復フローまで自動化できます。

本記事のポイントをまとめます。

  • SFCはシステムファイル修復: ローカルコンポーネントストアから修復。終了コードよりCBS.log[SR]エントリが信頼できる
  • DISMはコンポーネントストア修復: SFCの修復ソース自体が壊れている場合に使う。インターネット接続(またはソース指定)が必要
  • 推奨実行順序: SFC → DISM(失敗時のみ) → SFC(再実行)
  • 定期ヘルスチェックは verifyonly と CheckHealth: 高速・修復なし。週次実行で問題の早期発見が可能
  • DISMクリーンアップ: 月次実行で不要コンポーネントを削除してディスク容量を節約
  • ログ管理: ログ出力パターンと組み合わせて実行結果を必ず記録する
  • 管理者権限必須: 自動昇格バッチと組み合わせて運用を楽にする