使用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
相关产品推荐
相关产品推荐

