Объединить информацию Get-Disk и информацию LogicalDisk в PowerShell?

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

Write-Host "Drive information for $env:ComputerName"

Get-WmiObject -Class Win32_LogicalDisk |
    Where-Object {$_.DriveType -ne 5} |
    Sort-Object -Property Name | 
    Select-Object Name, VolumeName, VolumeSerialNumber,SerialNumber, FileSystem, Description, VolumeDirty, `
        @{"Label"="DiskSize(GB)";"Expression"={"{0:N}" -f ($_.Size/1GB) -as [float]}}, `
        @{"Label"="FreeSpace(GB)";"Expression"={"{0:N}" -f ($_.FreeSpace/1GB) -as [float]}}, `
        @{"Label"="%Free";"Expression"={"{0:N}" -f ($_.FreeSpace/$_.Size*100) -as [float]}} |
    Format-Table -AutoSize

Вывод:

введите здесь описание изображения

Однако мне нужна информация об физических дисках и информации об их разделах/томах:

Итак, для физических дисков у меня есть эта команда:

Get-Disk

Результат:

введите здесь описание изображения

Вопрос:

Я хочу объединить эти две команды. Я хочу видеть Disk , и под каждым диском - его информацию о логическом диске:

  • Диск номер 1 : ....(информация)
    >Информация о его логических дисках.....
  • Диск номер 2 : ....(информация)
    >Информация о логических дисках.....
  • Диск номер 3 : ....(информация)
    >Информация о логических дисках.....
  • так далее...

Как я могу объединить эти 2 запроса?


person Royi Namir    schedule 27.06.2015    source источник
comment
У меня был аналогичный вопрос некоторое время назад, не знаю, поможет ли этот ответ: serverfault.com/a/571669/822   -  person Kev    schedule 27.06.2015
comment
@Kev Спасибо, но мне это мало помогает. Буквы дисков являются продуктом раздела. Я не хочу переходить от буквы диска к его свойствам. Я хочу перейти с физического диска -----› их тома   -  person Royi Namir    schedule 27.06.2015


Ответы (3)


Вам нужно запросить несколько классов WMI, чтобы получить всю необходимую информацию.

  • Win32_DiskDrive предоставляет информацию о физических дисках.
  • Win32_DiskPartition предоставляет информацию о разделах на физических дисках. .
  • Win32_LogicalDisk предоставляет информацию о файловых системах внутри разделов.

Разделы можно сопоставить с их дисками с помощью класса Win32_DiskDriveToDiskPartition. , а диски можно сопоставить с их разделами через Win32_LogicalDiskToPartition класс.

Get-WmiObject Win32_DiskDrive | ForEach-Object {
  $disk = $_
  $partitions = "ASSOCIATORS OF " +
                "{Win32_DiskDrive.DeviceID='$($disk.DeviceID)'} " +
                "WHERE AssocClass = Win32_DiskDriveToDiskPartition"
  Get-WmiObject -Query $partitions | ForEach-Object {
    $partition = $_
    $drives = "ASSOCIATORS OF " +
              "{Win32_DiskPartition.DeviceID='$($partition.DeviceID)'} " +
              "WHERE AssocClass = Win32_LogicalDiskToPartition"
    Get-WmiObject -Query $drives | ForEach-Object {
      New-Object -Type PSCustomObject -Property @{
        Disk        = $disk.DeviceID
        DiskSize    = $disk.Size
        DiskModel   = $disk.Model
        Partition   = $partition.Name
        RawSize     = $partition.Size
        DriveLetter = $_.DeviceID
        VolumeName  = $_.VolumeName
        Size        = $_.Size
        FreeSpace   = $_.FreeSpace
      }
    }
  }
}
person Ansgar Wiechers    schedule 27.06.2015
comment
Превосходно. Именно то, что мне было нужно. Спасибо. - person Royi Namir; 27.06.2015
comment
Последний вопрос: мне удалось отобразить информацию в ГБ. так что с номером все в порядке. но я хочу добавить постфикс текста ((GB)), например 123.45(GB). но я наверное что-то упускаю. что мне изменить? посмотрите здесь: i.imgur.com/95QyaI4.png - person Royi Namir; 27.06.2015
comment
Если вы хотите, чтобы число отображалось как x GB, вы должны преобразовать его в строку, например. '{0:d} GB' -f [int]($_.Size / 1GB) - person Ansgar Wiechers; 27.06.2015
comment
Можно ли это сделать с помощью команд wmic из системной подсказки? - person simgineer; 19.12.2016
comment
Наверное. Но написание запросов для wmic было бы головной болью в тылу, поэтому меня это не беспокоит. - person Ansgar Wiechers; 19.12.2016
comment
Могу ли я быть уверен, что WMI всегда работает на каждой машине? - person karliwson; 17.02.2018
comment
@karliwson При нормальных обстоятельствах да. Однако остерегайтесь проблем с брандмауэром для удаленных подключений WMI. - person Ansgar Wiechers; 04.03.2018
comment
Как изменить порядок элементов в PSCustomObject? Например, заказать их по имени? - person Rakha; 04.05.2018
comment
догадаться! Если вы хотите, чтобы ваш список элементов был ORDERED, используйте [PSCustomObject][Ordered]@{ вместо New-Object -Type PSCustomObject -Property @{ - person Rakha; 04.05.2018
comment
Как можно изменить вывод DriveLetter : W: на Drive Letter : W:, отформатировав части DriveLetter, RawSize, VolumeName, FreeSpace, DiskModel так, чтобы было место, как в моем примере? - person Ste; 02.08.2020
comment
Я получил свои ответы на это здесь, если кто-то хочет. stackoverflow.com/questions/63219836/ Также Win32_LogicalDisk получает все диски, включая сетевые. Этот код упускает это. Есть ли способ добавить все диски, такие как сетевые диски? - person Ste; 05.08.2020

Как насчет такого...

Get-CimInstance Win32_Diskdrive -PipelineVariable disk |
Get-CimAssociatedInstance -ResultClassName Win32_DiskPartition -PipelineVariable partition |
Get-CimAssociatedInstance -ResultClassName Win32_LogicalDisk |
Select-Object @{n='Disk';e={$disk.deviceid}},
@{n='DiskSize';e={$disk.size}},
@{n='DiskModel';e={$disk.model}},
@{n='Partition';e={$partition.name}},
@{n='RawSize';e={$partition.size}},
@{n='DriveLetter';e={$_.DeviceID}},
VolumeName,Size,FreeSpace

Выход:

Disk        : \\.\PHYSICALDRIVE0
DiskSize    : 128034708480
DiskModel   : SAMSUNG MZ7PC128HAFU-000L5
Partition   : Disk #0, Partition #0
RawSize     : 128034595328
DriveLetter : C:
VolumeName  : DISK
Size        : 128034594816
FreeSpace   : 7023042560
person js2010    schedule 24.08.2018

Вдохновленный ответ js2010 с некоторыми улучшениями:

Например, кажется, что поле Manufacturer имеет какое-то значение-заполнитель при извлечении из экземпляра Win32_DiskDrive, но имеет правильное значение при использовании командлета Get-Disk.

function Get-Drive {

  foreach($disk in Get-CimInstance Win32_Diskdrive) {

    $diskMetadata = Get-Disk | Where-Object { $_.Number -eq $disk.Index } | Select-Object -First 1

    $partitions = Get-CimAssociatedInstance -ResultClassName Win32_DiskPartition -InputObject $disk

    foreach($partition in $partitions) {

      $drives = Get-CimAssociatedInstance -ResultClassName Win32_LogicalDisk -InputObject $partition

      foreach($drive in $drives) {

        $totalSpace = [math]::Round($drive.Size / 1GB, 3)
        $freeSpace  = [math]::Round($drive.FreeSpace / 1GB, 3)
        $usedSpace  = [math]::Round($totalSpace - $freeSpace, 3)

        $volume     = Get-Volume |
                      Where-Object { $_.DriveLetter -eq $drive.DeviceID.Trim(":") } |
                      Select-Object -First 1

        [PSCustomObject] @{
                            DriveLetter   = $drive.DeviceID
                            Number        = $disk.Index

                            Label         = $volume.FileSystemLabel
                            Manufacturer  = $diskMetadata.Manufacturer
                            Model         = $diskMetadata.Model
                            SerialNumber  = $diskMetadata.SerialNumber.Trim() 
                            Name          = $disk.Caption

                            FileSystem    = $volume.FileSystem
                            PartitionKind = $diskMetadata.PartitionStyle

                            TotalSpace    = $totalSpace
                            FreeSpace     = $freeSpace
                            UsedSpace     = $usedSpace

                            Drive         = $drive
                            Partition     = $partition
                            Disk          = $disk
        }

      }
    }
  }
}           

Примеры использования:

Get-Drive | Format-List
Get-Drive | Where-Object { $_.DriveLetter -eq 'G:' }

Выход:

DriveLetter   : G:
Number        : 5
Label         : SE-LXY2-298GB
Manufacturer  : Seagate
Model         : FreeAgent Go
SerialNumber  : 2GE45CK1
Name          : Seagate FreeAgent Go USB Device
FileSystem    : NTFS
PartitionKind : MBR
TotalSpace    : 298.089
FreeSpace     : 297.865
UsedSpace     : 0.224
Drive         : Win32_LogicalDisk: G: (DeviceID = "G:")
Partition     : Win32_DiskPartition: Disk #5, Partition #0 (DeviceID = "Disk #5, Partition #0")
Disk          : Win32_DiskDrive: Seagate FreeAgent Go USB Device (DeviceID = "\\.\PHYSICALDRIVE5")

person Raghu Dodda    schedule 06.06.2021