Powershell 递归 WMI 查询

quu*_*uux 6 scripting powershell wmi

我想从 WMI 命名空间的顶部开始,递归遍历所有对象,然后递归遍历每个对象的属性列表,过滤掉那些名称中包含mem 的属性并将其返回到控制台。

这是我到目前为止:

gwmi -namespace "root\cimv2" -list |???? |get-Member -MemberType property | Where-Object { $_.name -match 'mem'}
Run Code Online (Sandbox Code Playgroud)

注意大|???? 在中间那里。如果我删除它,该命令似乎可以运行,但无法找到我知道应该找到的属性。为什么?我认为这是因为我从以下两个命令中得到了不同的输出:

gwmi "Win32_operatingSystem"  |get-Member -MemberType property (73 lines of output)
gwmi -namespace "root\cimv2" -list  |where-object { $_.Name -eq 'Win32_OperatingSystem' } |get-Member -MemberType property (10 lines of output)
Run Code Online (Sandbox Code Playgroud)

我想要的是递归连接这个过程的单行:

gwmi -namespace "root\cimv2" -list
(manual selection of a WMI class from the list of 1000+ which appear) 
gwmi "win32_OperatingSystem" | get-Member -MemberType property | Where-Object { $_.Definition -match 'mem' }
Run Code Online (Sandbox Code Playgroud)

谢谢,如果给出了有效的答案,我接受并赞成它(当人们从不这样做时很烦人,不是吗?)。

注意补充2009/11/14:我还没有获得答案但因为还没有人提供了一个班轮解决了这个问题。

And*_*der 7

我认为这将在一行中完成您正在寻找的内容。CIMV2 命名空间默认存在,但如果您想选择不同的命名空间,可以使用 gwmi -namesapce。

“技巧”是在 foreach-object 旁边嵌套一个 where-object

gwmi -list | % {$_.Properties | ? {$_.Name.Contains('Memory')}} | select Origin,Name
Run Code Online (Sandbox Code Playgroud)