powershellfilesystemsdrive

Combine `Get-Disk` info and `LogicalDisk` info in PowerShell?


I have this query which scans all logical disks information :

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

The output is :

enter image description here

However - I'm after the physical disks information and their partitions / volume information :

So - for physical disks I have this command :

Get-Disk

Result :

enter image description here

Question :

I want to combine between those 2 commands . I want to see the Disk , and below each disk - its logical disk information :

How can I combine between those 2 queries ?


Solution

  • You need to query several WMI classes to get all information you want.

    Partitions can be mapped to their disks using the Win32_DiskDriveToDiskPartition class, and drives can be mapped to their partitions via the Win32_LogicalDiskToPartition class.

    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
          }
        }
      }
    }