问题:我需要通过非常高效的脚本方式找出哪个卷对应哪个分区,哪个分区对应哪个磁盘。我知道如何对应哪个分区对应哪个磁盘,因为磁盘 ID 直接位于简单 wmic 查询的结果中。但是,问题的第一部分更难。如何关联哪个卷属于哪个分区?
有没有一种方法可以使用 wmic、PowerShell、cmd 提示符来反向工程哪个卷映射到哪个分区,并且可以在所有当前支持的 Windows Server 版本(Windows Server 2008R2 - Windows Server 2016)上工作?
如果是的话,这个查询看起来怎么样?
使用 diskpart 获取信息不是一个选择。虽然它可以用于编写磁盘操作脚本,但使用 diskpart 作为返回磁盘配置信息的工具很糟糕。Diskpart 输出不可解析。
答案1
一种可能的解决方案是以下 power shell 脚本。输出应为 JSON 格式。此解决方案的问题在于它依赖于 get-partition cmdlet。此 cmdlet 是在 windows 2008R2 之后引入的。如果要将 get-partition cmdlet 移植到 windows 2008R2,或者如果我找到可以在 windows 2008R2 上执行相同操作的解决方案,这将是一种解决方案。虽然不是一个完整的解决方案,但它不适合作为评论。
$CimPartInfo = get-partition
"{"
foreach ($CimPart in $CimPartInfo) {
if ($CimPart.Guid -eq $null) {
$PartGUID = [regex]::match($CimPart.AccessPaths, 'Volume({[^}]+})').Groups[1].Value
}
else {
$PartGUID = $CimPart.Guid
}
"`"$PartGUID`": {"
"`"DiskId`": $($CimPart.DiskNumber),"
"`"PartitionId`": $($CimPart.PartitionNumber),"
"`"Type`": `"$($CimPart.Type)`","
"`"Size`": $($CimPart.Size),"
"`"Offset`": $($CimPart.Offset),"
"`"GUID`": `"$($CimPart.Guid)`","
$x = $CimPart.IsBoot
"`"Bootable`": $($x.ToString().ToLower()),"
"`"Status`": `"$($CimPart.OperationalStatus)`""
if ($CimPart -eq $CimPartInfo[-1]){ "}"}
else {"},"}
} #foreach CimPart
"}"
答案2
我目前无法发表评论,但这似乎非常接近您的解决方案。我在 WMI Tasks 中找到了标题为“...检测哪个驱动器号与逻辑磁盘分区相关联?”的文档(使用 VBScript)。
请注意:我绝对不精通 VBScript,因此我无法说出下面的方法有多么灵活和可修改,但是我相信它包含修改可按照您喜欢的格式解析的新脚本所需的所有信息。
来源:https://msdn.microsoft.com/en-us/library/aa394592(v=vs.85).aspx#code-snippet-11
ComputerName = "."
Set wmiServices = GetObject ( _
"winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName)
' Get physical disk drive
Set wmiDiskDrives = wmiServices.ExecQuery ( "SELECT Caption, DeviceID FROM Win32_DiskDrive")
For Each wmiDiskDrive In wmiDiskDrives
WScript.Echo "Disk drive Caption: " & wmiDiskDrive.Caption & VbNewLine & "DeviceID: " & " (" & wmiDiskDrive.DeviceID & ")"
'Use the disk drive device id to
' find associated partition
query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _
& wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"
Set wmiDiskPartitions = wmiServices.ExecQuery(query)
For Each wmiDiskPartition In wmiDiskPartitions
'Use partition device id to find logical disk
Set wmiLogicalDisks = wmiServices.ExecQuery _
("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _
& wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
For Each wmiLogicalDisk In wmiLogicalDisks
WScript.Echo "Drive letter associated" _
& " with disk drive = " _
& wmiDiskDrive.Caption _
& wmiDiskDrive.DeviceID _
& VbNewLine & " Partition = " _
& wmiDiskPartition.DeviceID _
& VbNewLine & " is " _
& wmiLogicalDisk.DeviceID
Next
Next
Next
当我测试此脚本时,我会在WScript.Echo
对话框中获取所有请求的信息。例如,在我的系统上,对话框显示:
VBScript 对话框输出