Назад | Перейти на главную страницу

Как указать, какой том на каком разделе в Windows находится?

Проблема: мне нужно выяснить, какой том соответствует тому разделу (разделам), который соответствует какому диску в чрезвычайно эффективном поместье с возможностью сценариев. Я знаю, как определить, какой раздел соответствует какому диску, потому что идентификатор диска находится непосредственно в результатах простого запроса wmic. Однако первая часть проблемы более сложная. Как соотнести, какой том к каким разделам принадлежит?

Есть ли способ, используя wmic, PowerShell, cmd, перепроектировать, какой том сопоставлен с каким разделом (ами), который работает во всех поддерживаемых в настоящее время версиях Windows Server (Windows Server 2008R2 - Windows Server 2016)?

Если да, то как бы выглядел этот запрос?

Использование diskpart для получения информации НЕ вариант. Хотя его можно использовать для написания сценариев дисковых операций, использовать diskpart в качестве инструмента для возврата информации о конфигурациях дисков ужасно. Вывод Diskpart НЕ анализируется.

Одно из возможных решений - это следующий скрипт Power Shell. Вывод должен быть в формате JSON. Проблема с этим решением в том, что оно полагается на командлет get-partition. Этот командлет был представлен после Windows 2008R2. Это могло бы работать как решение, если бы командлет get-partition был перенесен на Windows 2008R2, или если бы я нашел решение, которое будет делать то же самое в Windows 2008R2. Хотя это и не полное решение, оно не подходило для комментариев.

$CimPartInfo = get-partition
        "{"
        foreach ($CimPart in $CimPartInfo) {
            if ($CimPart.Guid -eq $null) {
                $PartGUID = [regex]::match($CimPart.AccessPaths, 'Volume({[^}]+})').Groups[1].Value
                }
             else {
                $PartGUID = $CimPart.Guid
                }
            "`"$PartGUID`": {"
            "`"DiskId`": $($CimPart.DiskNumber),"
            "`"PartitionId`": $($CimPart.PartitionNumber),"
            "`"Type`": `"$($CimPart.Type)`","
            "`"Size`": $($CimPart.Size),"
            "`"Offset`": $($CimPart.Offset),"
            "`"GUID`": `"$($CimPart.Guid)`","
            $x = $CimPart.IsBoot
            "`"Bootable`": $($x.ToString().ToLower()),"
            "`"Status`": `"$($CimPart.OperationalStatus)`""
            if ($CimPart -eq $CimPartInfo[-1]){ "}"}
            else {"},"}
            } #foreach CimPart
        "}"

В настоящее время я не могу публиковать комментарии, однако это кажется вам очень близким к решению. Я нашел документацию из WMI Tasks под названием «... определить, какая буква диска связана с логическим разделом диска?» в VBScript.

Пожалуйста, обратите внимание: Я никоим образом не разбираюсь в VBScript, поэтому я не могу сказать, насколько универсален и модифицируем приведенный ниже метод, однако я считаю, что в нем есть вся информация, необходимая для изменения нового скрипта, который можно анализировать в формате, который вам нравится.

Источник: https://msdn.microsoft.com/en-us/library/aa394592(v=vs.85).aspx#code-snippet-11

ComputerName = "."
Set wmiServices  = GetObject ( _
    "winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
' Get physical disk drive
Set wmiDiskDrives =  wmiServices.ExecQuery ( "SELECT Caption, DeviceID FROM Win32_DiskDrive")

For Each wmiDiskDrive In wmiDiskDrives
    WScript.Echo "Disk drive Caption: " & wmiDiskDrive.Caption & VbNewLine & "DeviceID: " & " (" & wmiDiskDrive.DeviceID & ")"

    'Use the disk drive device id to
    ' find associated partition
    query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _
        & wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"    
    Set wmiDiskPartitions = wmiServices.ExecQuery(query)

    For Each wmiDiskPartition In wmiDiskPartitions
        'Use partition device id to find logical disk
        Set wmiLogicalDisks = wmiServices.ExecQuery _
            ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
             & wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition") 

        For Each wmiLogicalDisk In wmiLogicalDisks
            WScript.Echo "Drive letter associated" _
                & " with disk drive = " _ 
                & wmiDiskDrive.Caption _
                & wmiDiskDrive.DeviceID _
                & VbNewLine & " Partition = " _
                & wmiDiskPartition.DeviceID _
                & VbNewLine & " is " _
                & wmiLogicalDisk.DeviceID
        Next      
    Next
Next

Когда я тестирую этот скрипт, я получаю всю запрошенную информацию в WScript.Echo диалоги. Например, в моей системе диалоговое окно показывает: Вывод диалогового окна VBScript