[登録されているタグ]

[記事公開日]2026/01/26

PowerShellでSSD / HDDの異常兆候を調べる方法(SMART的観点)

「壊れかけのサイン」をログとストレージ情報から拾う。SMARTの“数値そのもの”は取りにくい場合があるため、PowerShellでは「予兆の見つけ方」を軸に切り分ける。

PowerShell
SSD/HDD
SMART
トラブル調査

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. データ保護の観点:兆候が出た時にやるべき優先順位

  1. 最優先:必要データのバックアップ/救出(書き込みを増やさない)
  2. ログで兆候を確認(本記事の手順)
  3. 必要なら専用ツールでSMART詳細確認(環境に応じて)
  4. ストレージ交換・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
      

➡️ 関連記事(タイトル順)

すべてを開く | すべてを閉じる

ページ上部へ戻る