Guy Markman
Guy Markman

Reputation: 446

Find the interface type and revision of a hard drive using in a windows machine

I'm looking for a command in Windows (either cmd or powershell) which will allow me to get which exact type of bus interface my storage device have, not only the type, but also the revision (SATA3, SATA4, NVME2.0 and so on).

For example:

> wmic diskdrive get InterfaceRevision
InterfaceRevision
SATA3
SATA4
NVME2.0

Upvotes: 0

Views: 989

Answers (1)

RetiredGeek
RetiredGeek

Reputation: 3168

This will get you the bus but not the version.


Function Get-MaxLength {

<#
.SYNOPSIS
   Finds the length of the longest item in collection.

.DESCRIPTION
   Use this Function to get the length of the longest item in a
   collection for use in format strings or other places where
   needed.

.PARAMETER TestObj
    The qualified object to be tested. See example!

.Parameter MinLen
    The minimum length of the item (if using for formatting) which
    should be the Label (title) length. Note if the object item
    being tested does not have a Length property you MUST specify
    the label length!

.OUTPUTS
    Returns a numerical value

.EXAMPLE
   $NameLen = Get-MaxLength -TestObj $DotNet.PSChildName
   $VerLen  = Get-MaxLength -TestObj $DotNet.Version
   $RNLen   = Get-MaxLength -TestObj $DotNet.Release -MinLen 11

     #--- .Net Information ---

 $fmtDotNet =
  @{Expression={$_.PSChildName};Label=".Net Type";Width=$NameLen},
  @{Expression={$_.Version};Label="Version No:";Width=$VerLen},
  @{Expression={$_.Release};Label="Release No:";Width=$RNLen}

  $Dotnet | Format-Table $fmtDotNet
#>

  Param(
    [Parameter(Mandatory=$True)]
     [object] $TestObj,
    [Parameter(Mandatory=$False)]
     [int] $MinLen = 0,
    [Parameter(Mandatory=$False)]
     [int] $MaxLen = 0
  )

   $ErrorActionPreference = "SilentlyContinue"

   foreach ($x in $TestObj) {
     If ($x.Trim().length -gt $MinLen) {
       $MinLen = $x.Trim().length
     }
   }

   If ($MaxLen -ne 0) {
     If ($MinLen -gt $MaxLen) {
       $MinLen = $MaxLen
     }
   }

   $ErrorActionPreference = "Continue"

   Return ,$MinLen

} #End Function -----------  Get-MaxLength  -------------------

Function PhysicalDiskTab {

  #Physical Drive Info

  $PhyDiskInfo = Get-Disk  | Where-Object {$_.size -gt 0 } |
                 Sort-Object -Property DiskNumber

  $SSD = $False

  $AMArgs = @{Type  = 'NoteProperty'
              Name  = 'SSD'
              Value = 'No'}
  $PhyDiskInfo | Add-Member @AMArgs

  $AMArgs = @{Type  = 'NoteProperty'
              Name  = 'Speed'
              Value = '0'}
  $PhyDiskInfo | Add-Member @AMArgs

  $GCIArgs = @{
     NameSpace    = "root\Microsoft\Windows\Storage"
     Class        = "MSFT_PhysicalDisk"
     ErrorAction  = "SilentlyContinue"
  }
  $RotateSpeed = Get-CimInstance @GCIArgs |
    Select-Object -Property  DeviceID,@{Name="Speed/RPMs";
      Expression={(&{If($_.MediaType -eq 0) {[Int]0}
            Else {$_.SpindleSpeed/600000 -f "#,###"}})}} |
      Sort-Object DeviceID

ForEach ($x in $phydiskinfo) {

  ForEach ($Device in $RotateSpeed) {
      If ($x.number -eq $Device.DeviceID) {
        If ($Device.'Speed/RPMs' -eq 0) {
            $SSD   = $True
          $x.SSD = "Yes"
        }  #End If
        Else {
         $x.Speed = $([Int]$Device.'SPeed/RPMs') -f "#,###"
        }
      }  #End If ($x.number...
  }      #End ForEach ($Device

} #End ForEach $x

$DNLen =
  Get-MaxLength -TestObj $PhyDiskInfo.Model        -MinLen 4
$SNLen =
  Get-MaxLength -TestObj $PhyDiskInfo.SerialNumber -MinLen 13

$fmtPhyDisk1 =
   @{Expression={ '{0:N0}' -f $_.Number};
       Label="Drive`n No.";Width=5;Align='Center'},
   @{Expression={$_.Model};Label="`nName";Width=$DNLen},
   @{Expression={$_.SSD};Label="`nSSD";Width=3;Align='left'},
   @{Expression={ '{0:#,000.00}' -f ($_.Size/1gb)};
       Label="Disk Size`n / GB";Width=9;align='right'},
   @{Expression={$_.NumberOfPartitions};
       Label="Parti`ntions";Width=5},
   @{Expression={$_.PartitionStyle};Label="GPT`nMBR";Width=3},
   @{Expression={(&{If ($_.IsBoot) {"Yes"} else {""}})};
       Label="`nBoot";Width=5;Align="Left"},
   @{Expression={(&{If ($_.BusType.GetType().Name -eq 'UInt16'){
       (& {Switch ($_.BusType) {
            0 {"Unknown"}
            1 {"SCSI"}
            2 {"ATAPI"}
            3 {"ATA"}
            4 {"1394"}
            5 {"SSA"}
            6 {"Fibre Channel"}
            7 {"USB"}
            8 {"RAID"}
            9 {"iSCSI"}
           10 {"SAS"}
           11 {"SATA"}
           12 {"SD"}
           13 {"MMC"}
           14 {"MAX"}
           15 {"File Backed Virtual"}
           16 {"Storage Spaces"}
           17 {"NVMe"}
           18 {"MS Reserved"}
           Default {"Unknown"}}})}
         Else{$_.BusType}})};Label="`nData Bus";Width=20}

  $fmtPhyDisk2 =
     @{Expression={ '{0:N0}' -f $_.Number};
         Label="Drive`n No.";Width=5;Align='Center'},
     @{Expression={$_.Model};Label="`nName";Width=$DNLen},
     @{Expression={$_.SerialNumber.Trim()};
         Label="`nSerial Number";Width=$SNLen;Align='left'},
     @{Expression={
        (&{If ($_.HealthStatus.GetType().Name -eq 'UInt16'){
         (& {Switch ($_.HealthStatus) {
              0      {"Healthy"}
              1      {"Warning"}
              2      {"Unhealthy"}
             Default {"Unknown"}}})}
           Else{$_.HealthStatus}})};Label="`nStatus";Width=7},
     @{Expression={$_.Speed};
         Label="Rotation`n  RPMs  ";Width=8;Align='Right'}

  $PhyDiskInfo1 = $PhyDiskInfo |
           Format-Table -Property $fmtPhyDisk1 -Wrap |
           Out-String   -Width $OStrWidth

  $PhyDiskInfo2 = $PhyDiskInfo |
           Format-Table -Property $fmtPhyDisk2 -Wrap |
           Out-String   -Width $OStrWidth

  $PhyDiskTitle  = "Physical Disk Information:" | Out-String

  Return ,$($PhyDiskTitle  + $PhyDiskInfo1 + $PhyDiskInfo2)

} #End Function ---------------- PhysicalDiskTab --------------

$OStrWidth = 79
PhysicalDiskTab

Output:

Physical Disk Information:

Drive                               Disk Size Parti GPT                        
 No.  Name                      SSD      / GB tions MBR Boot  Data Bus         
----- -----                     --- --------- ----- --- ----- ---------        
  0   Samsung SSD 960           Yes    232.89     4 GPT Yes   NVMe             
  1   Samsung SSD 850 PRO 256GB Yes    238.47     2 GPT       SATA             
  2   Samsung SSD 850 PRO 256GB Yes    238.47     1 GPT       SATA             



Drive                                                        Rotation
 No.  Name                      Serial Number        Status    RPMs  
----- -----                     --------------       ------- --------
  0   Samsung SSD 960           0025_3853_81B0_B2EB. Healthy        0
  1   Samsung SSD 850 PRO 256GB S39KNX0J687882W      Healthy        0
  2   Samsung SSD 850 PRO 256GB S39KNX0J688151N      Healthy        0

This code was pulled from my CMsLocalPCInfoW10 program which can be downloaded from my shared OneDrive library.

Upvotes: 2

Related Questions