Я хочу отобразить тип носителя в порядке загрузки в конфигурации BIOS. У меня есть такая конфигурация bios, и я сохраняю ее в текстовом файле
PciRoot(0x0)/Pci(0x1B,0x0)/Pci(0x0,0x0)/NVMe(0x1,7D-F0-B6-71-B7-38-25-00)
PciRoot(0x0)/Pci(0x1B,0x4)/Pci(0x0,0x0)/NVMe(0x1,00-00-00-00-00-00-00-00)
PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x1,0xFFFF,0x0)
PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x3,0xFFFF,0x0)
. Я проверяю путь к файлу diskpart с помощью diskpart.exe и сохраняю его также в текстовом файле, например, последовательно из DeviceID 0на DeviceID 3
Location Path : PCIROOT(0)#PCI(1700)#ATA(C01T00L00)
Location Path : PCIROOT(0)#PCI(1700)#ATA(C03T00L00)
Location Path : PCIROOT(0)#PCI(1B00)#PCI(0000)#NVME(P00T00L00)
Location Path : PCIROOT(0)#PCI(1B04)#PCI(0000)#NVME(P00T00L00)
Я использую PowerShell, чтобы получить DeviceID и MediaType, а также вывести файл в текстовый файл, например,
DeviceID : 2
BusType : NVMe
MediaType : SSD
DeviceID : 0
BusType : SATA
MediaType : SSD
DeviceID : 1
BusType : SATA
MediaType : HDD
DeviceID : 3
BusType : NVMe
Теперь я должен определить это
PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x1,0xFFFF,0x0)
PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x3,0xFFFF,0x0)
Что такое MediaType этого порядка загрузки. Я добавляю номер DeviceID к этому файлу, и вот так:
DeviceID : 0/Location Path : PCIROOT(0)#PCI(1700)#ATA(C01T00L00)
DeviceID : 1/Location Path : PCIROOT(0)#PCI(1700)#ATA(C03T00L00)
Я попытался поймать его, разделив эту информацию Sata(0x1,0xFFFF,0x0)
и получив 0x1
. Я хочу сопоставить это значение с этим, чтобы идентифицировать число DeviceID
для сопоставления MediaType.
Location Path : PCIROOT(0)#PCI(1700)#ATA(C01T00L00)
Location Path : PCIROOT(0)#PCI(1700)#ATA(C03T00L00)
Location Path : PCIROOT(0)#PCI(1B00)#PCI(0000)#NVME(P00T00L00)
Location Path : PCIROOT(0)#PCI(1B04)#PCI(0000)#NVME(P00T00L00)
Я пробовал это, и это работает, но, похоже, выполнить процесс вручную, чтобы проверить. И я должен проверить одну за другой, у меня проблема, если у меня много данных этого
PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x1,0xFFFF,0x0)
PciRoot(0x0)/Pci(0x17,0x0)/Sata(0x3,0xFFFF,0x0)
Может ли кто-нибудь помочь мне изменить мой сценарий. Спасибо.
Function Level_2
{
# Read diskpart result from diskpart.exe and catch the location path
$Read_List = Get-Content D:\Source\DISK.TXT | Where-Object {$_ -like "*Location Path*"} | Out-File D:\Source\LocPath -Force | Out-Null
# Numbering the line
$file = "D:\Source\LocPath"
$targetfile = "D:\Source\LocPath.txt"
if(!(Test-Path "D:\Source\LocPath.txt"))
{
$linecount = -1
foreach ($line in (Get-Content $file)) {
$linecount++
$newline = ""+"DeviceID"+" "+" "+":"+" "+$linecount+"/"+$line
Add-Content $targetfile $newline -Force
}
}
else{
Write-Host "File exist"
}
# Filter only SATA
$Filter_SATA = Get-Content D:\Source\LocPath.txt| Where-Object {$_ -like "*ATA*"} | Out-File D:\Source\LocPath_Sata.txt -Force | Out-Null
# Read diskpart result from bios config and catch the SATA
$BIOS = Get-Content D:\Source\Bios_BO.txt | Where-Object {$_ -like "*SATA*"}
$BIOS | Out-File D:\Source\Sata_BO.txt -Force | Out-Null
# Get length boot order sata
$GetLength = $BIOS.Count
#Check the total of SATA, If no more than 1, do not do comparing
If(!($GetLength -gt 1))
{
Write-Host "Only has 1 SATA exist"
Pause
}
Write-Host "Continue comparing"
Sata_Compare_1
}
Function Check_MediaType
{
# Check 1st MediaType
$Device_disk = Get-Content D:\Source\PS_Diskpart.txt | Where-Object {$_ -like "*$Device*"}
$MType = Get-PhysicalDisk -DeviceNumber "$Number"
$MType.MediaType
#Check mediatype
If($MType.MediaType -eq "HDD")
{
Write-Host "Failed, continue the next process"
}
else{
Write-Host "Correct"
}
}
# Sata_Compare_1
Function Sata_Compare_1
{
#Read diskpart from PS to get MediaType
$PS = Get-PhysicalDisk | Select-Object DeviceID, BusType, MediaType | Format-List | Out-File D:\Source\PS_Diskpart.txt
# Read 1st bios order SATA
$sata = Get-Content D:\Source\Sata_BO.txt
$split = $sata -split "/"
$pattern = $split[2]
$FixPattern = $pattern.Substring(5,3)
$bios_pattern = $FixPattern.Substring($FixPattern.get_Length()-1)
# Read 1st boot order location path
$loc = Get-Content D:\Source\LocPath_Sata.txt | Where-Object {$_ -like "*ATA*"}
$Splits = $loc[0]
$deviceid_0 = $splits.Substring(0,13)
$type = $Splits.Substring($Splits.get_Length()-11)
$patterns = $type.Substring(1,3)
$diskpart_pattern = $patterns.Substring($patterns.get_Length()-1)
if($bios_pattern -eq $diskpart_pattern)
{
Write-Host "Match"
$Device = $deviceid_0
$Number = $bios_pattern
Check_Type
}
else{
Write-Host "Check disk_1"
}
# Check the 2nd boot order bios
$pattern_1 = $split[5]
$FixPattern_1 = $pattern_1.Substring(5,3)
$bios_pattern_1 = $FixPattern_1.Substring($FixPattern_1.get_Length()-1)
# Check the 2nd boot order location path
$Splits_1 = $loc[1]
$deviceid_1 = $Splits_1.Substring(0,13)
$type_1 = $Splits_1.Substring($Splits_1.get_Length()-11)
$patterns_1 = $type_1.Substring(1,3)
$diskpart_pattern_1 = $patterns_1.Substring($patterns_1.get_Length()-1)
if($bios_pattern_1 -eq $diskpart_pattern_1)
{
Write-Host "Match"
$Device = $deviceid_1
$Number = $bios_pattern_1
Check_Type
}
else{
Write-Host "Check next disk_2"
}
# Check the 3rd boot order bios
$pattern_2 = $split[8]
$FixPattern_2 = $pattern_2.Substring(5,3)
$bios_pattern_2 = $FixPattern_2.Substring($FixPattern_2.get_Length()-1)
# Check the 2nd boot order location path
$Splits_2 = $loc[1]
$deviceid_2 = $Splits_2.Substring(0,13)
$type_2 = $Splits_2.Substring($Splits_2.get_Length()-11)
$pattern_2 = $type_2.Substring(1,3)
$diskpart_pattern_2 = $pattern_2.Substring($pattern_2.get_Length()-1)
if($bios_pattern_2 -eq $diskpart_pattern_2)
{
Write-Host "Match"
$Device = $deviceid_2
$Number = $bios_pattern_2
Check_Type
}
else{
Write-Host "Check next disk_3"
}
}