我有一個 PowerShell 腳本來獲取硬碟資訊(如硬碟型別、序列號、大小)。我的想法是我會得到 DeviceID,如果 DeviceID 中的模型名稱有“SSD”。它將顯示這是 SSD,反之亦然。但是,我的腳本很長,重復代碼很多。
##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"
}
}
結果如下:
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
在我的腳本中,如何壓縮我的腳本?
uj5u.com熱心網友回復:
這是一種方法:
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
}
uj5u.com熱心網友回復:
我會使用一個專門的函式來使代碼更簡潔。
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
}
}
}
現在,你所要做的就是打電話
Get-DiskSpecs
它回傳一個物件的集合,例如
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
但是,我認為您正在以一種非常有趣的方式計算大小,我會選擇另一個輔助函式來格式化給定的位元組大小:
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"
}
如果你把它放在你的腳本之上并使用它,這個函式Get-DiskSpecs可以縮短為:
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
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/418650.html
標籤:
上一篇:如何將雙引號字串傳遞給sc.exe以獲取binPath
下一篇:如何將特定型別轉換為泛型型別
