Комбиниране на информация за `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

Резултат:

въведете описание на изображението тук

Въпрос:

Искам да комбинирам тези 2 команди. Искам да видя диска, и под всеки диск - неговата информация за логическия диск:

  • Диск номер 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. така че числото е добре. но искам да добавя постфикс на текст ((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
разбрах го! Ако искате списъкът ви с артикули да е ПОРЪЧЕН, използвайте [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