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
}
}
}
