找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 1197|回复: 5

[问题求助] 如何判断硬盘是hdd还是ssd?

[复制链接]
发表于 2026-4-27 18:53:39 | 显示全部楼层 |阅读模式
我想用powershell代码判断硬盘是否是机械硬盘, 但是使用下面的代码, 机械硬盘返回如下:
系统盘 C: 所在磁盘 ST3160811AS 原始 MediaType: Unspecified

  1. $systemDrive = $env:SystemDrive
  2. $systemDiskNumber = (Get-Partition -DriveLetter $systemDrive.TrimEnd(':') | Get-Disk).Number
  3. $physicalDisk = Get-PhysicalDisk -DeviceNumber $systemDiskNumber

  4. $mediaType = $physicalDisk.MediaType
  5. $spindleSpeed = $physicalDisk.SpindleSpeed
  6. $seekPenalty = $physicalDisk.SeekPenalty
  7. $model = $physicalDisk.FriendlyName

  8. Write-Host "系统盘 $systemDrive 所在磁盘 $model 原始 MediaType: $mediaType"

复制代码
发表于 2026-4-28 13:02:25 | 显示全部楼层
  1. $systemDrive = $env:SystemDrive
  2. $systemDiskNumber = (Get-Partition -DriveLetter $systemDrive.TrimEnd(':') | Get-Disk).Number
  3. $physicalDisk = Get-PhysicalDisk -DeviceNumber $systemDiskNumber

  4. $mediaType = $physicalDisk.MediaType
  5. $spindleSpeed = $physicalDisk.SpindleSpeed
  6. $seekPenalty = $physicalDisk.SeekPenalty
  7. $model = $physicalDisk.FriendlyName

  8. if($mediaType -ne "SSD"){
  9.     $mediaType = "HDD"
  10. }

  11. Write-Host "系统盘 $systemDrive 所在磁盘 $model 原始 MediaType: $mediaType"
复制代码
发表于 2026-4-28 13:08:27 来自手机 | 显示全部楼层
增加两个判断项吧,,,
SpindleSpeed:
若显示 $null 或 0 则是 SSD
若是 5400/7200 (转速,机械盘特有)  则是 HDD
SeekPenalty:
显示 0  SSD  
显示 1  HDD

如果是 iscsi 虚拟盘,,则要判断总线类型,,
$busType = (Get-PhysicalDisk -DeviceNumber $systemDiskNumber).BusType
if ($busType -eq 'iSCSI') { Write-Host "iSCSI 虚拟盘}
 楼主| 发表于 2026-5-3 16:48:56 | 显示全部楼层
jiavip 发表于 2026-4-28 13:08
增加两个判断项吧,,,
SpindleSpeed:
若显示 $null 或 0 则是 SSD

我的机械硬盘那个速度那里也显示0
发表于 2026-5-5 15:33:19 | 显示全部楼层
本帖最后由 yakeyun 于 2026-5-5 15:34 编辑

  1. # 设置错误处理
  2. $ErrorActionPreference = "Stop"

  3. try {
  4.     # 一次性获取所有磁盘信息,减少重复查询
  5.     $disks = Get-WmiObject Win32_DiskDrive | Select-Object Model, InterfaceType, Size, MediaType, SerialNumber
  6.     $physicalDisks = Get-PhysicalDisk | Select-Object FriendlyName, MediaType, Size, HealthStatus, OperationalStatus

  7.     # 创建结果数组
  8.     $results = @()

  9.     # 遍历每个磁盘
  10.     foreach ($disk in $disks) {
  11.         $model = $disk.Model.Trim()
  12.         $sizeGB = if ($disk.Size) { [math]::Round($disk.Size / 1GB, 2) } else { 0 }

  13.         # 查找匹配的物理磁盘信息
  14.         $mediaMatch = $physicalDisks | Where-Object { $_.FriendlyName.Trim() -eq $model }
  15.         
  16.         $mediaType = if ($mediaMatch) {
  17.             switch ($mediaMatch.MediaType) {
  18.                 3 { "HDD" }
  19.                 4 { "SSD" }
  20.                 5 { "SCM" } # Storage Class Memory
  21.                 default { $mediaMatch.MediaType.ToString() }
  22.             }
  23.         } else { "Unknown" }

  24.         $healthStatus = if ($mediaMatch) { $mediaMatch.HealthStatus } else { "Unknown" }
  25.         $operationalStatus = if ($mediaMatch) { $mediaMatch.OperationalStatus } else { "Unknown" }

  26.         # 根据接口和媒体类型确定磁盘类型
  27.         $diskType = switch ($disk.InterfaceType) {
  28.             "SCSI" {
  29.                 switch ($mediaType) {
  30.                     "SSD" { "M.2固态硬盘" }
  31.                     "HDD" { "SAS机械硬盘" }
  32.                     "SCM" { "存储级内存" }
  33.                     default { "SCSI设备" }
  34.                 }
  35.             }
  36.             "USB" {
  37.                 switch ($mediaType) {
  38.                     "SSD" { "USB固态硬盘" }
  39.                     "HDD" { "USB机械硬盘" }
  40.                     default { "USB存储设备" }
  41.                 }
  42.             }
  43.             "IDE" {
  44.                 switch ($mediaType) {
  45.                     "SSD" { "SATA固态硬盘" }
  46.                     "HDD" { "SATA机械硬盘" }
  47.                     default { "IDE设备" }
  48.                 }
  49.             }
  50.             "NVMe" { "NVMe固态硬盘" }
  51.             "SATA" {
  52.                 switch ($mediaType) {
  53.                     "SSD" { "SATA固态硬盘" }
  54.                     "HDD" { "SATA机械硬盘" }
  55.                     default { "SATA设备" }
  56.                 }
  57.             }
  58.             default { "未知设备" }
  59.         }

  60.         # 添加到结果数组
  61.         $results += [PSCustomObject]@{
  62.             "磁盘型号" = $model
  63.             "接口类型" = $disk.InterfaceType
  64.             "媒体类型" = $mediaType
  65.             "磁盘类型" = $diskType
  66.             "容量(GB)" = $sizeGB
  67.             "健康状态" = $healthStatus
  68.             "运行状态" = $operationalStatus
  69.             "序列号" = $disk.SerialNumber
  70.         }
  71.     }

  72.     # 输出详细磁盘信息
  73.     Write-Host "`n磁盘详细信息:" -ForegroundColor Green
  74.     $results | Sort-Object "磁盘类型" | Format-Table -AutoSize -Property "磁盘型号", "磁盘类型", "容量(GB)", "接口类型", "媒体类型", "健康状态", "运行状态"

  75.     # 统计汇总
  76.     $summary = $results | Group-Object "磁盘类型" | ForEach-Object {
  77.         $totalSizeGB = ($_.Group | Measure-Object -Property "容量(GB)" -Sum).Sum
  78.         [PSCustomObject]@{
  79.             "磁盘类型" = $_.Name
  80.             "数量" = $_.Count
  81.             "总容量(GB)" = [math]::Round($totalSizeGB, 2)
  82.         }
  83.     }

  84.     # 输出汇总信息
  85.     Write-Host "`n磁盘类型统计汇总:" -ForegroundColor Cyan
  86.     $summary | Sort-Object "数量" -Descending | Format-Table -AutoSize

  87.     # 导出结果到CSV文件
  88.     $csvPath = Join-Path -Path $env:USERPROFILE -ChildPath "Desktop\DiskInfo_$(Get-Date -Format 'yyyyMMdd_HHmmss').csv"
  89.     $results | Export-Csv -Path $csvPath -NoTypeInformation -Encoding UTF8
  90.     Write-Host "`n结果已导出到: $csvPath" -ForegroundColor Yellow

  91. } catch {
  92.     Write-Host "`n发生错误: $_" -ForegroundColor Red
  93.     Write-Host "错误详情: $($_.ScriptStackTrace)" -ForegroundColor DarkYellow
  94. }
复制代码



输出信息如下,可以根据工作环境修改具体代码执行需求:
PS C:\Users\Administrator\Desktop> C:\Users\Administrator\Desktop\disks.ps1

磁盘详细信息:

磁盘型号                              磁盘类型     容量(GB) 接口类型 媒体类型    健康状态    运行状态   
----                              ----     ------ ---- ----    ----    ----   
Samsung SSD 860 EVO 250GB         SATA固态硬盘 232.88 IDE  SSD     Healthy OK     
Innostor Secured Drive USB Device USB存储设备       0 USB  Unknown Unknown Unknown
Innostor 903 USB Device           USB存储设备  110.06 USB  Unknown Unknown Unknown



磁盘类型统计汇总:

磁盘类型     数量 总容量(GB)
----     -- -------
USB存储设备   2  110.06
SATA固态硬盘  1  232.88



结果已导出到: C:\Users\Administrator\Desktop\DiskInfo_20260505_153035.csv

PS C:\Users\Administrator\Desktop>
 楼主| 发表于 2026-5-7 11:42:15 | 显示全部楼层
yakeyun 发表于 2026-5-5 15:33
输出信息如下,可以根据工作环境修改具体代码执行需求:
PS C:%users\Administrator\Desktop> C:%users\ ...


感谢回复, 这个不支持win7的powershell2, 而且对于有的没有类型值的情况不兼容
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-5-26 06:31

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表