[記事公開日]2026/01/26
PowerShellでSSD / HDDの異常兆候を調べる方法(SMART的観点)
「壊れかけのサイン」をログとストレージ情報から拾う。SMARTの“数値そのもの”は取りにくい場合があるため、PowerShellでは「予兆の見つけ方」を軸に切り分ける。
SSDやHDDの故障は、突然死のように見えても、実は前兆が出ていることがあります。
ただ、SMART値の“生データ(属性IDごとの数値)”は、環境やコントローラによってPowerShell単体では取り切れないケースが少なくありません。
そのため現場では、「SMARTっぽい観点」で異常兆候(予兆)を拾い、必要なら専用ツールへ繋げるのが効率的です。
この記事では、PowerShellでできる範囲で「怪しい兆候」を見つける実務手順をまとめます。
※ここで扱うのは「断定」ではなく「兆候(可能性)」です。
兆候が強い場合は、通電・書き込みを繰り返さず、データ保護(バックアップ/救出)を優先してください。
もくじ
1. まず結論:PowerShellで見るべき“SMART的観点”は3系統
- A:Windowsが持つ「故障予測フラグ」(SMARTのFailurePredicted相当:取れる環境なら強い)
- B:ストレージの状態/エラー痕跡(Systemログ:disk/Ntfs/stor* など)
- C:体感に直結する兆候(応答遅延・タイムアウト・リセット・再試行)
現場ではまずB(ログ)で兆候を押さえ、A(予測フラグ)が取れれば補強、最後にC(遅延/不安定)の状況証拠を積む流れが最短です。
2. 取れるなら最優先:SMART「故障予測フラグ」を確認する
一部環境では、WindowsのWMIで「SMARTの故障予測(FailurePredicted)」に相当する情報が取れます。
まずは「取れるかどうか」を確認します(NVMeやUSBケース配下では取れないこともあります)。
2-1. SMART予測フラグ(FailurePredicted)を確認
Get-CimInstance -Namespace root\wmi -ClassName MSStorageDriver_FailurePredictStatus | Select-Object InstanceName, PredictFailure, Reason | Format-Table -AutoSize
- PredictFailure = True:かなり危険(データ保護を最優先)
- PredictFailure = False:現時点で“予測フラグは立っていない”が、問題なしの保証ではない
PredictFailure が True の場合、通電と書き込みを続けるほど悪化することがあります。
「データ救出が目的」なら、まずコピー/救出を優先し、診断は後回しにするのが安全です。
※このクラスが取得できない/値が出ない場合でも、ストレージが正常とは限りません。
次の「ログ兆候確認」に進んでください。
3. 実務の本命:Systemログで「異常兆候(予兆)」を拾う
ストレージの不調は、SMART値が取れなくても「タイムアウト」「リセット」「再試行」などの痕跡がログに出ることがあります。
まずはストレージ関連のプロバイダーをまとめて拾います。
3-1. ストレージ系イベントをまとめて抽出(disk / Ntfs / stor* など)
Get-WinEvent -FilterHashtable @{
LogName = "System"
ProviderName = "disk","Ntfs","volmgr","partmgr","storahci","stornvme","nvme","storport","iaStorA","iaStorAC"
} -MaxEvents 400 |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending
3-2. 「怪しいワード」を含むログだけに絞る(読みやすくする)
下のキーワードは実務でよく出る“異常兆候”です。環境により表記が違うため、広めに拾います。
$days = 30
$kw = "タイムアウト|リセット|再試行|不良|I/O|IO|CRC|コントローラ|応答|エラー|reset|timeout|retry|failed|bad|corrupt|stuck"
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
($_.ProviderName -in @("disk","Ntfs","volmgr","partmgr","storahci","stornvme","nvme","storport","iaStorA","iaStorAC")) -and
($_.Message -match $kw)
} |
Select-Object TimeCreated, ProviderName, Id, LevelDisplayName, Message |
Sort-Object TimeCreated -Descending |
Select-Object -First 200
ここで「タイムアウト」「リセット」「I/Oエラー」などが繰り返し出ている場合、SMART値が見えなくてもストレージ不調の兆候として十分強いです。
4. 「物理的に壊れかけ」を疑う典型パターン(ログ観点)
- disk/Ntfs のエラーが増える(I/Oエラー、読み書き失敗、ボリューム関連の警告)
- storport/storahci/stornvme のリセット(デバイスの応答遅延→リセット)
- CRC/通信エラー(SATAケーブル・接触・USBケース含む経路の問題も候補)
- 起動・復帰時に固まる(スリープ復帰や再起動時に詰まる)
特に「リセット」「タイムアウト」が頻発している場合は、体感で“遅い”だけで済まず、
ある日突然認識しなくなる(突然死)に繋がることもあります。
5. PowerShellで「遅延/不安定」を数値寄りに見る(パフォーマンスの兆候)
SMARTの生値が取れない場合でも、「異常兆候」として遅延が増えているかどうかを見るのは有効です。
ここでは、ストレージの基本情報と、OSが見ている状態を確認します。
5-1. 物理ディスク/論理ディスクの状態(見える範囲で)
# 物理ディスク(Storageモジュール) Get-PhysicalDisk | Select-Object FriendlyName, MediaType, HealthStatus, OperationalStatus, Size | Format-Table -AutoSize # ボリューム(ドライブ文字) Get-Volume | Select-Object DriveLetter, FileSystem, HealthStatus, SizeRemaining, Size | Format-Table -AutoSize
HealthStatus が “Warning/Unhealthy” のように出るなら強いサインですが、正常に見えてもログに兆候が出ることはあります。
「ここが正常だから安心」と決め打ちせず、ログと合わせて判断してください。
5-2. NVMe/SSD/HDD をざっくり見分ける(機種によって差あり)
Get-PhysicalDisk |
Select-Object FriendlyName, MediaType, BusType, Size, HealthStatus |
Format-Table -AutoSize
6. “SMARTの生値”が見えない時に疑うべき理由(よくある落とし穴)
- USB接続(外付けケース/変換):SMARTが透過されないことがある
- NVMe:古いドライバ/環境ではWMIで取りにくいことがある
- RAID/IRST/VMD:コントローラ配下でSMARTが見えづらいことがある
- 仮想環境:ゲストOSから物理SMARTが取れない
こういう環境差があるため、PowerShellだけで「SMART全属性の数値」を出すのは難易度が上がります。
その代わり、ログ兆候(タイムアウト/リセット/エラー)は環境差があっても拾えることが多いです。
7. データ保護の観点:兆候が出た時にやるべき優先順位
- 最優先:必要データのバックアップ/救出(書き込みを増やさない)
- ログで兆候を確認(本記事の手順)
- 必要なら専用ツールでSMART詳細確認(環境に応じて)
- ストレージ交換・OS再構築(原因がストレージ寄りなら先に交換)
「認識したりしなかったり」「コピー中に止まる」「接続するとPCが固まる」などがある場合、
その状態でchkdskや修復を試すと状況が悪化することがあります。
まずはデータ保護を優先してください。
8. 仕上げ:調査結果を“提出用”に整える(1行化+絞り込み)
ログは改行が多く読みづらいので、1行化して貼れる形にすると便利です。
$days = 14
Get-WinEvent -FilterHashtable @{
LogName = "System"
StartTime = (Get-Date).AddDays(-$days)
} |
Where-Object {
$_.ProviderName -in @("disk","Ntfs","volmgr","partmgr","storahci","stornvme","nvme","storport","iaStorA","iaStorAC")
} |
ForEach-Object {
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
Provider = $_.ProviderName
Id = $_.Id
Level = $_.LevelDisplayName
Message = ($_.Message -replace "\r?\n"," ")
}
} |
Sort-Object TimeCreated -Descending |
Select-Object -First 200 |
Format-Table -AutoSize
➡️ 関連記事(タイトル順)
- PowerShellで起動時間が遅い原因を調べる方法(イベントログでボトルネック特定)
- PowerShellで接続された外付けストレージ履歴を確認する方法(USB/外付けHDD/SSD/SDカード)
- PowerShellでブルースクリーン履歴を確認する方法(STOPコード/再起動痕跡)
- PowerShellでバッテリー劣化を数値で確認する方法(ノートPC)
- PowerShellでネットワーク切断履歴を調べる方法(有線・Wi-Fi共通)
- PowerShellでドライバーエラーを一覧表示する方法(デバイス不調の切り分け)
- PowerShellで「電源が落ちた原因」を調べる方法(Event ID 41 / 6008 実践)
- PowerShellでWindowsアップデート失敗履歴を確認する方法(原因の手掛かりをログで掴む)
- PowerShellでUSB抜き差し履歴を確認する方法(接続・切断・認識不良の痕跡)
- PowerShellでSSD / HDDの異常兆候を調べる方法(SMART的観点)
