Как сопоставить MediaType конфигурации BIOS с Diskpart, используя PowerShell? - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу отобразить тип носителя в порядке загрузки в конфигурации 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"
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...