sfc / DISM - システムファイルを修復する
Windows の動作が不安定なときや、設定やスタートメニューなどの標準機能が正常に動作しないときに試したいのが、システムファイルチェッカー(sfc) です。保護されている Windows のシステムファイルを検査し、壊れていたり書き換えられていたりした場合は正しいバージョンに置き換えます。
sfc で直らない場合は、修復元となるコンポーネントストア自体を直す DISM コマンドを組み合わせます。この記事では、両方の使い方と実行順序を解説します。
事前準備:管理者として実行する
sfc と DISM は、管理者として実行したコマンドプロンプトでのみ動作します。通常の権限で実行すると、「管理者としてコンソール セッションを実行している必要がある」という趣旨のエラーが表示され、スキャンは始まりません。
管理者として起動する方法は、
を参照してください。sfc の基本構文
sfc [/scannow] [/verifyonly] [/scanfile=<ファイル>] [/verifyfile=<ファイル>]
[/offbootdir=<ドライブ> /offwindir=<Windowsフォルダー>] [/offlogfile=<ログファイル>]
| オプション | 説明 |
|---|---|
/scannow | すべての保護ファイルを検査し、問題があれば修復する |
/verifyonly | すべての保護ファイルを検査するだけで、修復はしない |
/scanfile=<ファイル> | 指定した 1 つのファイルを検査し、問題があれば修復する(フルパスで指定) |
/verifyfile=<ファイル> | 指定した 1 つのファイルを検査するだけで、修復はしない(フルパスで指定) |
/offbootdir /offwindir | 起動していない Windows を修復対象にする(回復環境などから実行するとき。両方の指定が必要) |
/offlogfile=<ログファイル> | オフライン修復時のログの出力先を指定する |
システム全体を検査・修復する
sfc /scannow
実行すると、検査の進行状況が「検証 xx% が完了しました。」と表示されます。環境によっては数十分から 1 時間以上かかるため、途中でウィンドウを閉じたり、PC を終了したりしないでください。
特定の割合で長時間止まっているように見えることがありますが、処理は続いています。しばらく待っても終わらない場合を除き、強制終了は避けてください。
結果メッセージの読み方
終了すると、次のいずれかのメッセージが表示されます。
| メッセージ(要旨) | 意味と次の対応 |
|---|---|
| Windows リソース保護により、整合性違反は検出されませんでした。 | システムファイルに問題はありません。別の原因を調べます。 |
| Windows リソース保護により、破損したファイルが見つかり、正常に修復されました。 | 修復完了です。PC を再起動して状況を確認します。 |
| Windows リソース保護により、破損したファイルが見つかりましたが、一部は修復できませんでした。 | 次の「DISM で修復元を直す」に進みます。 |
| Windows リソース保護は、要求された操作を実行できませんでした。 | 修復を実行できなかった状態です。セーフ モードで再実行します。それでも失敗する場合は、C:\Windows\WinSxS\Temp に PendingDeletes と PendingRenames フォルダーがあるか確認します。回復環境から実行する場合は /offbootdir と /offwindir を指定します。 |
修復後は、念のため sfc /scannow をもう一度実行して「整合性違反は検出されませんでした」と表示されることを確認すると安心です。
修復せずに検査だけ行う
システムを変更せずに状態だけ知りたい場合は、/verifyonly を使います。
sfc /verifyonly
特定のファイルだけを検査・修復する
破損しているファイルが分かっている場合は、フルパスで指定できます。
sfc /scanfile=C:\Windows\System32\kernel32.dll
sfc /verifyfile=C:\Windows\System32\kernel32.dll
詳細をログで確認する
sfc の詳細は、C:\Windows\Logs\CBS\CBS.log に記録されます。このファイルは非常に大きいため、sfc に関する行([SR] が付いた行)だけを取り出すと読みやすくなります。
findstr /c:"[SR]" "%windir%\Logs\CBS\CBS.log" > "%userprofile%\Desktop\sfcdetails.txt"
> はリダイレクトで、出力をファイルに書き込みます。詳しくは
findstr についてはを参照してください。
sfc 以外の処理も同じログに記録されるため、[SR] で絞り込まない状態では目的の行を探しにくくなります。
sfc で直らないとき:DISM で修復元を直す
sfc は、コンポーネントストア(C:\Windows\WinSxS)に保存されているファイルを使って修復します。このコンポーネントストア自体が壊れていると、sfc は修復できません。その場合は、DISM(Deployment Image Servicing and Management)でコンポーネントストアを修復します。
DISM /Online /Cleanup-Image /RestoreHealth
| コマンド | 内容 |
|---|---|
DISM /Online /Cleanup-Image /CheckHealth | 破損が記録されているかを素早く確認する(修復はしない) |
DISM /Online /Cleanup-Image /ScanHealth | コンポーネントストア全体を検査する(修復はしない) |
DISM /Online /Cleanup-Image /RestoreHealth | 検査して、破損があれば修復する |
/RestoreHealth は、既定では Windows Update から修復用のファイルを取得するため、インターネット接続が必要です。完了までに時間がかかり、進行状況の割合が途中で止まって見えることもあります。
実行順序
Microsoft は、DISM で修復元を直してから sfc を実行する順序を案内しています。一方、まず sfc を試し、直らなかった場合に DISM へ進み、最後にもう一度 sfc を実行する方法もあります。どちらでも、最終的に sfc /scannow で問題が解消したことを確認します。
DISM を先に行う場合の手順は次のとおりです。
DISM /Online /Cleanup-Image /RestoreHealthを実行する- 完了したら
sfc /scannowを実行する - 再起動して、症状が改善したか確認する
DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow
Windows Update に接続できない環境では、/Source オプションで正常な Windows のイメージを修復元に指定できます。たとえば /Source:WIM:X:\sources\install.wim:1 のように指定し、Windows Update に接続させない場合は /LimitAccess を併用します。使用するイメージは、現在インストールされている Windows とバージョン・エディション・言語を合わせる必要があります。
バッチファイルから実行する
管理者権限で動くバッチファイルにまとめておくと、手順を毎回入力せずに済みます。
@echo off
net session >nul 2>&1
if errorlevel 1 (
echo 管理者として実行してください。
pause
exit /b 1
)
echo === DISM による修復元の検査・修復 ===
DISM /Online /Cleanup-Image /RestoreHealth
echo.
echo === sfc によるシステムファイルの検査・修復 ===
sfc /scannow
echo.
echo 完了しました。結果を確認し、必要に応じて再起動してください。
pause
net session は管理者権限がないと失敗するため、権限の簡易チェックとして使われます。ただし、Server サービスが停止している環境では、管理者でも失敗することがあります。管理者権限で自動的に再起動する方法は、
上のバッチファイルは echo に日本語を含むため、UTF-8 で保存するとコマンドプロンプトで文字化けすることがあります。Shift_JIS(ANSI)で保存するか、先頭付近に chcp 65001 >nul を追加してください。詳しくは
DISM の詳細なログは C:\Windows\Logs\DISM\dism.log に記録されます。失敗した場合はこちらも確認してください。
まとめ
| やりたいこと | コマンド |
|---|---|
| システムファイルを検査して修復する | sfc /scannow |
| 検査だけして修復はしない | sfc /verifyonly |
| 特定のファイルだけ検査・修復する | sfc /scanfile=フルパス |
| sfc の詳細ログを取り出す | findstr /c:"[SR]" "%windir%\Logs\CBS\CBS.log" |
| 修復元(コンポーネントストア)を修復する | DISM /Online /Cleanup-Image /RestoreHealth |