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

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

「Windowsが不安定になった」「アプリが突然クラッシュする」「system32フォルダのファイルが壊れている気がする」—そんな場面で真っ先に使うのがsfc /scannowDISMコマンドです。

どちらもWindowsに標準搭載されており、システムファイルの整合性チェックと修復を行います。バッチファイルと組み合わせることで、次のことが実現できます。

  • タスクスケジューラによる定期ヘルスチェック(週次・月次)
  • SFC → DISM → SFC 修復フローの完全自動化
  • 修復ログの自動保存と重要エントリの抽出
  • 複数PCへの一括展開(管理者向け)
  • 問題検出時のメール・ポップアップ通知

本記事では各コマンドの仕組みから、実務で使えるバッチスクリプトまで体系的に解説します。

スポンサーリンク

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 → DISM(SFC失敗時のみ) → SFC(再実行)」の順が基本です。予防的なヘルスチェックなら高速なDISM /CheckHealthsfc /verifyonlyの順が効率的です。
QSFCで「破損ファイルを修復しました」と表示されました。再起動は必要ですか?
A必ずしも必要ではありませんが、修復されたファイルが現在使用中の場合は次回起動時に改めて修復が行われます。念のため一度再起動することを推奨します。「次の再起動時に修復する予定のファイルが見つかりました」と表示された場合は再起動が必要です。
QDISM /RestoreHealth がエラーで失敗します。インターネットには接続できています。
AWindows Update接続の一時的な問題が原因のことが多いです。wuauclt.exe /resetauthorization /detectnowでWindows Updateをリセット後に再試行するか、インストールメディアを/Sourceオプションで指定してオフライン修復を試みてください。
QバッチからSFCを実行すると文字化けします。
Achcp 65001(UTF-8)またはchcp 932(Shift-JIS)をバッチ先頭に入れるか、sfc /scannow > log.txtでログファイルに出力して後から確認する方法が確実です。
QSFCで「整合性違反が見つかりませんでした」と出ましたが、PCが不安定なままです。
ASFCはWindowsシステムファイルの整合性のみをチェックします。不安定の原因がシステムファイル以外(ドライバー・メモリ不良・HDDの不良セクター)の場合は、それぞれメモリテスト(mdsched.exe)・ドライブチェック(chkdsk /f /r)・ウイルス対策ソフトのフルスキャンを実施してください。
QDISM.log と CBS.log はどのくらいの容量になりますか?
ACBS.logは長期使用のPCでは数十MB〜100MB以上になることがあります。Windowsは自動的にCbsPersist_*.cabとして圧縮アーカイブするため容量は管理されますが、ディスクが圧迫されている場合はC:\Windows\Logs\CBS\CbsPersist_*.cabを削除できます。
Qタスクスケジューラで毎週SFCを自動実行しても問題ありませんか?
A毎回/scannow(修復あり)の自動実行は不要な書き込みが増えるため推奨しません。sfc /verifyonly(確認のみ)なら副作用が少ないため週次実行に向いています。問題を検出した場合のみ手動または別スクリプトで/scannowを実行するフローが最も安全です。
QDISMをバッチから実行するとき管理者権限で実行されているかどうかどうやって確認できますか?
A管理者権限確認バッチのようにnet sessionコマンドで権限を確認できます。DISMは権限が不足していると「このコマンドは管理者として実行する必要があります」というエラーが表示され、終了コードが1になります。

まとめ

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

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

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