You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Get-WmiObject查询Win32_DiskPartition时提示无效查询的问题求助

解决Get-WmiObject无效查询错误(兼容旧系统)

问题场景

运行PowerShell脚本时触发Get-WmiObject的无效查询错误,因需兼容旧操作系统,必须保留使用Get-WmiObject而非Get-CimInstance。

原脚本

ForEach($link in Get-WmiObject Win32_LogicalDiskToPartition){
    $partition = Get-WmiObject Win32_DiskPartition -Filter "Path = $($link.Antecedent)"
    [PSCustomObject]@{
        "System Name" = $partition.SystemName
        "Drive Letter" = $link.Dependent.DeviceID
        "Partition Style" =  $partition.Type
    }
}

报错信息

PS C:\Windows\system32> ForEach($link in Get-WmiObject Win32_LogicalDiskToPartition){
    $partition = Get-WmiObject Win32_DiskPartition -Filter "Path = $($link.Antecedent)"
    [PSCustomObject]@{
        "System Name" = $partition.SystemName
        "Drive Letter" = $link.Dependent.DeviceID
        "Partition Style" =  $partition.Type
    }
}
Get-WmiObject : Invalid query "select * from Win32_DiskPartition where Path = \\SERVER1\root\cimv2:Win32_DiskPartition.DeviceID=\"Disk #0, Partition #1\""
At line:2 char:18
+ ... partition = Get-WmiObject Win32_DiskPartition -Filter "Path = $($link ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
 

System Name Drive Letter Partition Style
----------- ------------ ---------------
                                        
Get-WmiObject : Invalid query "select * from Win32_DiskPartition where Path = \\SERVER1\root\cimv2:Win32_DiskPartition.DeviceID=\"Disk #1, Partition #0\""
At line:2 char:18
+ ... partition = Get-WmiObject Win32_DiskPartition -Filter "Path = $($link ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
 
                                        
Get-WmiObject : Invalid query "select * from Win32_DiskPartition where Path = \\SERVER1\root\cimv2:Win32_DiskPartition.DeviceID=\"Disk #3, Partition #0\""
At line:2 char:18
+ ... partition = Get-WmiObject Win32_DiskPartition -Filter "Path = $($link ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
 
                                        
Get-WmiObject : Invalid query "select * from Win32_DiskPartition where Path = \\SERVER1\root\cimv2:Win32_DiskPartition.DeviceID=\"Disk #2, Partition #0\""
At line:2 char:18
+ ... partition = Get-WmiObject Win32_DiskPartition -Filter "Path = $($link ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-WmiObject], ManagementException
    + FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

错误原因

$link.Antecedent返回的是完整的WMI对象路径(格式类似\\SERVER1\root\cimv2:Win32_DiskPartition.DeviceID="Disk #0, Partition #1"),而Get-WmiObject的-Filter参数要求的是基于对象属性的查询语法,不能直接传入完整路径,因此触发无效查询错误。

修复方案

方案1:直接使用-Path参数获取对象(推荐)

利用WMI对象路径直接定位目标分区,无需构造Filter,效率更高:

ForEach($link in Get-WmiObject Win32_LogicalDiskToPartition){
    $partition = Get-WmiObject -Path $link.Antecedent
    [PSCustomObject]@{
        "System Name" = $partition.SystemName
        "Drive Letter" = $link.Dependent.DeviceID
        "Partition Style" = $partition.Type
    }
}

方案2:解析路径提取DeviceID构造Filter

如果需要通过Filter方式查询,可从Antecedent路径中提取DeviceID属性值,再构造合法的Filter:

ForEach($link in Get-WmiObject Win32_LogicalDiskToPartition){
    # 从Antecedent路径中提取DeviceID的具体值
    $deviceId = ($link.Antecedent -split 'DeviceID="')[1] -split '"' | Select-Object -First 1
    $partition = Get-WmiObject Win32_DiskPartition -Filter "DeviceID = '$deviceId'"
    [PSCustomObject]@{
        "System Name" = $partition.SystemName
        "Drive Letter" = $link.Dependent.DeviceID
        "Partition Style" = $partition.Type
    }
}

内容的提问来源于stack exchange,提问作者Arbelac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 12:07:49