Home > OS >  PowerShell Hard Disks verifier
PowerShell Hard Disks verifier

Time:01-21

I have a PowerShell script to get hard disks information (like hard disk type, Serial number, Size). My idea is that I will get DeviceID and if the name of the model in DeviceID has "SSD". It will show this is SSD and vice versa. However, my script is so long and there are a lot of repeat codes.


##PhysicalDisk_Slot 00

$Disk00 = Get-PhysicalDisk | Where-Object {$_.DeviceID -match ‘0’ -and $_.model -match ("SSD")}

if ($Disk00.FriendlyName -like "*SSD*")
{
      $DiskMD00 = Get-PhysicalDisk | where { $_.DeviceID -match ‘0’} | Select-object -ExpandProperty FriendlyName
      $DiskSN00 = Get-PhysicalDisk | where { $_.DeviceID -match ‘0’} | Select-object -ExpandProperty SerialNumber
      $DiskSize00 = Get-PhysicalDisk | where { $_.DeviceID -match ‘0’} | Select-object -ExpandProperty Size 
      $DiskSize0 = $DiskSize00 / 1024MB
      Write-Host -fore Green `n `t "Specs: DeviceID: 0"           
      Write-Host -fore Green `t "Specs: SSD Model"               `t`t`t ":"$DiskMD00
      Write-Host -fore Green `t "Specs: SSD Serial Number"           `t ":"$DiskSN00
      if($DiskSize0 -ge 210)
      {
          Write-Host -fore Green `t "Specs: SSD Size"            `t`t`t ": 250GB"
      }
      else
      {
          Write-Host -fore Green `t "Specs: SSD Size"                `t ":"([Math]::Round($DiskSize0, 2))"GB"
      }
}

else {

      $DiskMD00 = Get-PhysicalDisk | where { $_.DeviceID -match ‘0’} | Select-object -ExpandProperty FriendlyName
      $DiskSN00 = Get-PhysicalDisk | where { $_.DeviceID -match ‘0’} | Select-object -ExpandProperty SerialNumber
      $DiskSize00 = Get-PhysicalDisk | where { $_.DeviceID -match ‘0’} | Select-object -ExpandProperty Size
      $DiskSize0 = $DiskSize00 / 1024MB
      Write-Host -fore Green `n `t "Specs: DeviceID: 0"           
      Write-Host -fore Green `t "Specs: HDD Model"               `t`t`t ":"$DiskMD00
      Write-Host -fore Green `t "Specs: HDD Serial Number"           `t ":"$DiskSN00
      if($DiskSize0 -ge 910)
      {
          Write-Host -fore Green `t "Specs: HDD Size"             t`t`t ": 1TB"
      }
      else
      {
          Write-Host -fore Green `t "Specs: HDD Size"                `t ":"([Math]::Round($DiskSize0, 2))"GB"
      }
}


##PhysicalDisk_Slot 01

$Disk01 = Get-PhysicalDisk | Where-Object {$_.DeviceID -match ‘1’ -and $_.model -match ("SSD")}

if ($Disk01.FriendlyName -like "*SSD*")
     {
      $DiskMD01 = Get-PhysicalDisk | where { $_.DeviceID -match ‘1’} | Select-object -ExpandProperty FriendlyName
      $DiskSN01 = Get-PhysicalDisk | where { $_.DeviceID -match ‘1’} | Select-object -ExpandProperty SerialNumber
      $DiskSize01 = Get-PhysicalDisk | where { $_.DeviceID -match ‘1’} | Select-object -ExpandProperty Size
      $DiskSize1 = $DiskSize01 / 1024MB
      Write-Host -fore Green `n `t "Specs: DeviceID: 1"           
      Write-Host -fore Green `t "Specs: SSD Model"               `t`t`t ":"$DiskMD01
      Write-Host -fore Green `t "Specs: SSD Serial Number"           `t ":"$DiskSN01
      if($DiskSize1 -ge 210)
      {
          Write-Host -fore Green `t "Specs: SSD Size"            `t`t`t ": 250GB"
      }
      else
      {
          Write-Host -fore Green `t "Specs: SSD Size"                `t ":"([Math]::Round($DiskSize1, 2))"GB"
      }
}

else {

      $DiskMD01 = Get-PhysicalDisk | where { $_.DeviceID -match ‘1’} | Select-object -ExpandProperty FriendlyName
      $DiskSN01 = Get-PhysicalDisk | where { $_.DeviceID -match ‘1’} | Select-object -ExpandProperty SerialNumber
      $DiskSize01 = Get-PhysicalDisk | where { $_.DeviceID -match ‘1’} | Select-object -ExpandProperty Size
      $DiskSize1 = $DiskSize01 / 1024MB
      Write-Host -fore Green `n `t "Specs: DeviceID: 1"           
      Write-Host -fore Green `t "Specs: HDD Model"               `t`t`t ":"$DiskMD01
      Write-Host -fore Green `t "Specs: HDD Serial Number"           `t ":"$DiskSN01
      if($DiskSize1 -ge 910)
      {
          Write-Host -fore Green `t "Specs: HDD Size"            `t`t`t ": 1TB"
      }
      else
      {
          Write-Host -fore Green `t "Specs: HDD Size"                `t ":"([Math]::Round($DiskSize1, 2))"GB"
      }
}

##PhysicalDisk_Slot 02

$Disk02 = Get-PhysicalDisk | Where-Object {$_.DeviceID -match ‘2’ -and $_.model -match ("SSD")}

if ($Disk02.FriendlyName -like "*SSD*")
     {
      $DiskMD02 = Get-PhysicalDisk | where { $_.DeviceID -match ‘2’} | Select-object -ExpandProperty FriendlyName
      $DiskSN02 = Get-PhysicalDisk | where { $_.DeviceID -match ‘2’} | Select-object -ExpandProperty SerialNumber
      $DiskSize02 = Get-PhysicalDisk | where { $_.DeviceID -match ‘2’} | Select-object -ExpandProperty Size
      $DiskSize2 = $DiskSize02 / 1024MB
      Write-Host ""
      Write-Host -fore Green `n `t "Specs: DeviceID: 2"           
      Write-Host -fore Green `t "Specs: SSD Model"               `t`t`t ":"$DiskMD02
      Write-Host -fore Green `t "Specs: SSD Serial Number"           `t ":"$DiskSN02
      if($DiskSize2 -ge 210)
      {
          Write-Host -fore Green `t "Specs: SSD Size"            `t`t`t ": 250GB"
      }
      else
      {
          Write-Host -fore Green `t "Specs: SSD Size"                `t ":"([Math]::Round($DiskSize2, 2))"GB"
      }
     }

else {

      $DiskMD02 = Get-PhysicalDisk | where { $_.DeviceID -match ‘2’} | Select-object -ExpandProperty FriendlyName
      $DiskSN02 = Get-PhysicalDisk | where { $_.DeviceID -match ‘2’} | Select-object -ExpandProperty SerialNumber
      $DiskSize02 = Get-PhysicalDisk | where { $_.DeviceID -match ‘2’} | Select-object -ExpandProperty Size
      $DiskSize2 = $DiskSize02 / 1024MB
      Write-Host -fore Green `n `t "Specs: DeviceID: 2"           
      Write-Host -fore Green `t "Specs: HDD Model"               `t`t`t ":"$DiskMD02
      Write-Host -fore Green `t "Specs: HDD Serial Number"           `t ":"$DiskSN02
      if($DiskSize1 -ge 910)
      {
          Write-Host -fore Green `t "Specs: HDD Size"            `t`t`t ": 1TB"
      }
      else
      {
          Write-Host -fore Green `t "Specs: HDD Size"                `t ":"([Math]::Round($DiskSize2, 2))"GB"
      }
}

and the result below:

     Specs: DeviceID: 0
     Specs: SSD Model            : Samsung SSD 860 EVO 250GB
     Specs: SSD Serial Number    : 
     Specs: SSD Size             : 250GB

     Specs: DeviceID: 1
     Specs: HDD Model            : ST1000DM010-2EP102
     Specs: HDD Serial Number    : 
     Specs: HDD Size             : 1TB

     Specs: DeviceID: 2
     Specs: HDD Model            : ST1000DM 003-1ER162
     Specs: HDD Serial Number    : 
     Specs: HDD Size             : 1TB

In my script, how I can compact my script?

CodePudding user response:

Here is one way to do it:

Get-PhysicalDisk | ForEach-Object -Begin { $i = 0 } -Process {
    Write-Host -Object "`n `t Specs: DeviceID: $i" -ForegroundColor Green
    Write-Host -ForegroundColor Green "`t Specs: SSD Model        `t`t`t : $( $_.FriendlyName )"
    Write-Host -ForegroundColor Green "`t Specs: SSD Serial Number      `t`t`t : $( $_.SerialNumber )"
    if ( ( $DiskSize = $_.Size ) / 1GB -ge 210 ) { $Size = "250 GB" }
    else { $Size = "$( [Math]::Round( $DiskSize, 2 ) ) GB" }
    Write-Host -ForegroundColor Green "`t Specs: SSD Size               `t`t`t : $( $Size )"
    $i  = 1
}

CodePudding user response:

I would use a dedicated function to make the code a lot more concise.

function Get-DiskSpecs {
    # create and output an object with the wanted properties
    Get-PhysicalDisk | ForEach-Object {

        # calculate the size. (this does not match the real sizes ???)
        $tempSize = $_.Size / 1024MB
        $size = '{0}GB' -f ([Math]::Round($tempSize, 2))
        if ($_.MediaType -eq 'SSD') {
            if ($tempSize -ge 210) { $size = '250GB'}
        }
        elseif ($tempSize -ge 910) { $size = '1TB'}

        [PsCustomObject]@{
            DeviceId     = $_.DeviceId
            Type         = $_.MediaType     # instead of: if ($_.FriendlyName -like "*SSD*") {'SSD'} else {'HDD'}
            Model        = $_.FriendlyName
            SerialNumber = $_.SerialNumber
            Size         = $size
        }
    }
}

Now, all you have to do is call

Get-DiskSpecs

and it returns a collection of objects like

DeviceId     : 0
Type         : HDD
Model        : ST3500418AS
SerialNumber : 9VMRAT50
Size         : 465,76GB

DeviceId     : 1
Type         : SSD
Model        : Samsung SSD 750 EVO 250GB
SerialNumber : S33SNWDH513210X
Size         : 250GB

However, I think you are calculating the size in a really funny way, and I would opt for another helper function to format the given size in bytes:

function Format-ByteSize {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [ValidateRange(0, [double]::MaxValue)]
        [double]$SizeInBytes
    )

    $units = "Bytes", "KB", "MB", "GB", "TB", "PB"
    $index = 0

    while ($SizeInBytes -gt 1024 -and $index -le $units.length) {
        $SizeInBytes /= 1024
        $index  
    }
    if ($index) {
        return '{0:N2} {1}' -f $SizeInBytes, $units[$index]
    }

    "$SizeInBytes Bytes"
}

If you put that on top of your script and use that, the function Get-DiskSpecs can be shortened to:

function Get-DiskSpecs {
    # create and output an object with the wanted properties
    Get-PhysicalDisk | ForEach-Object {
        [PsCustomObject]@{
            DeviceId     = $_.DeviceId
            Type         = $_.MediaType     # instead of: if ($_.FriendlyName -like "*SSD*") {'SSD'} else {'HDD'}
            Model        = $_.FriendlyName
            SerialNumber = $_.SerialNumber
            Size         = Format-ByteSize $_.Size
        }
    }
}
  •  Tags:  
  • Related