在PowerShell中结合"Get-Disk"信息和"LogicalDisk"信息?

Roy*_*mir 9 filesystems powershell drive

我有这个查询扫描所有逻辑磁盘信息:

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
Run Code Online (Sandbox Code Playgroud)

输出是:

在此输入图像描述

但是 - 我正在查看物理磁盘信息及其分区/卷信息:

所以 - 对于物理磁盘我有这个命令:

Get-Disk

结果:

在此输入图像描述

题 :

我想在这两个命令之间进行组合.我想看到磁盘,在每个磁盘下面 - 它的逻辑磁盘信息:

  • 磁盘编号1:....(info)
    >其逻辑磁盘信息.....
  • 磁盘编号2:....(info)
    >这是逻辑磁盘信息.....
  • 磁盘编号3:....(info)
    >这是逻辑磁盘信息.....
  • 等等...

如何在这两个查询之间进行组合?

Ans*_*ers 26

您需要查询多个WMI类以获取所需的所有信息.

可以使用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
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


js2*_*010 5

像这样怎么样...

Get-CimInstance Win32_Diskdrive -PipelineVariable disk |
Get-CimAssociatedInstance -ResultClassName Win32_DiskPartition -pv 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
Run Code Online (Sandbox Code Playgroud)

输出:

Disk        : \\.\PHYSICALDRIVE0
DiskSize    : 128034708480
DiskModel   : SAMSUNG MZ7PC128HAFU-000L5
Partition   : Disk #0, Partition #0
RawSize     : 128034595328
DriveLetter : C:
VolumeName  : DISK
Size        : 128034594816
FreeSpace   : 7023042560
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不适用于多个驱动器。get-cim Associatedinstance 与 sort-object 类似,并且仅设置最新的管道变量。这是一个解决方法:

Get-CimInstance Win32_Diskdrive -PipelineVariable disk |
% { Get-CimAssociatedInstance $_ -ResultClass Win32_DiskPartition -pv 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   : 4226514944

Disk        : \\.\PHYSICALDRIVE1
DiskSize    : 7797565440
DiskModel   : USB Flash Memory USB Device
Partition   : Disk #1, Partition #0
RawSize     : 7801405440
DriveLetter : E:
VolumeName  : WINPE
Size        : 7784628224
FreeSpace   : 7222669312
Run Code Online (Sandbox Code Playgroud)