PowershellrecursionWMI查询

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

这是我迄今为止:

gwmi -namespace "root\cimv2" -list |???? |get-Member -MemberType property | Where-Object { $_.name -match 'mem'} 

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

 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) 

我想要的是recursion地连接这个过程的单线程:

 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' } 

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

附注2009/11/14补充:我还没有答复,因为还没有人提供解决问题的单线程。

我认为这将做你正在寻找的一行。 CIMV2命名空间在默认情况下是存在的,但是如果你想select一个不同的命名空间,你可以使用gwmi -namesapce。

“诀窍”是将一个“对象”嵌套在“对象”的对象中

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

看起来像这样:

gwmi -namespace“root \ cimv2”-list

返回一个ManagementClass .Net对象数组,因此您可以使用ManagementClass.Properties集合来select名称中包含特定string的属性。 这是我的PowerShell脚本:

 foreach($class in gwmi -namespace "root\cimv2" -list) { foreach($property in $class.Properties) { if($property.Name.Contains('Memory')) { $class.Name + ' --- ' + $property.Name } } } 

正如你所看到的,我是一个PowerShell初学者,但是我认为你可以从中做一个“一行”。

我想通过列出你获得WMI CLASS对象的命名空间,而不是实际的对象实例 – 你通过gwmi获得“win32_OperatingSystem”如果你使用gm,你会看到:

TypeName:System.Management。 ManagementClass #ROOT \ cimv2 \ Win32_OperatingSystem VS TypeName:System.Management。 ManagementObject #root \ cimv2 \ Win32_OperatingSystem

编辑:你可以做这样的事情:

gwmi -namespace "root\cimv2" -list | %{ gwmi -class $_.name.tostring()}

如果你想要所有的属性与MEM *那么你可以尝试| select-object "mem*" | select-object "mem*"

但我不确定这是否真的是你想要的。 我认为这是非常无效的,如果你只需要知道内存的数量。 你真的想要输出什么?

这里有点晚了,但我很确定下面会让你到你想要得到的地方 – 这是WMI命名空间中所有具有“mem”名称的属性的列表

 foreach ($i in gwmi -namespace "root\cimv2" -list ){$i.properties | where-object {$_.name -match 'mem'}| format-table origin,name} 

下载Microsoft的Scriptomatic2和PowershellScriptomatic。 他们都是hta应用程序,所以你可以查看他们作为纯文本,看看他们是如何做到这一点。