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

廉价感情. 提交于 2019-12-17 09:45:41

问题


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 :

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

So - for physical disks I have this command :

Get-Disk

Result :

Question :

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

  • Disk Number 1 : ....(info)
    >Its logical disks info.....
  • Disk Number 2 : ....(info)
    >It's logical disks info.....
  • Disk Number 3 : ....(info)
    >It's logical disks info.....
  • etc...

How can I combine between those 2 queries ?


回答1:


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

  • Win32_DiskDrive gives you information about the physical disks.
  • Win32_DiskPartition gives you information about the partitions on the physical disks.
  • Win32_LogicalDisk gives you information about the filesystems inside the partitions.

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



回答2:


How about like this...

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

Output:

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



回答3:


I did it like this:

[String]([Math]::Round($_.Size/1GB, 2)) + ' GB'



来源:https://stackoverflow.com/questions/31088930/combine-get-disk-info-and-logicaldisk-info-in-powershell

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!