我想从 WMI 命名空间的顶部开始,递归遍历所有对象,然后递归遍历每个对象的属性列表,过滤掉并仅将名称中包含mem的属性返回到控制台。
这是我到目前为止所拥有的:
gwmi -namespace "root\cimv2" -list |???? |get-Member -MemberType property | Where-Object { $_.name -match 'mem'}
注意大|???? 在中间那里。如果我删除它,该命令似乎会运行,但无法找到我知道应该找到的属性。为什么?我认为这是因为我从以下两个命令中得到了不同的输出:
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)
我想要的是一个递归连接这个过程的单行代码:
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 命名空间默认存在,但如果您想选择不同的命名空间,可以使用 gwmi -namesapce。
“技巧”是在 foreach-object 中嵌套 where-object
看起来像这样:
gwmi -namespace "root\cimv2" -list
返回一个 ManagementClass .Net 对象数组,因此您可以使用 ManagementClass.Properties 集合来选择名称中包含特定字符串的属性。这是我的 PowerShell 脚本:
如您所见,我是 PowerShell 初学者,但我认为您可以从中制作“单线”。
我认为通过列出命名空间,您将获得 WMI CLASS 对象,而不是实际的对象实例 - 您通过 gwmi "win32_OperatingSystem" 获得如果您使用 gm,您将看到:
类型名称: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*"
但我不确定这是否真的是你想要的。如果您只需要知道内存量,我认为这是非常无效的。您真正想要输出什么?
这里有点晚了,但我很确定下面会带你到你想要得到的地方 - 这是 WMI 命名空间中名称中包含“mem”的所有属性的列表
下载 Microsoft 的 Scriptomatic2 和 PowershellScriptomatic。它们都是 hta 应用程序,因此您可以将它们作为纯文本查看,以了解它们是如何做到的。