Powershell 递归 WMI 查询

Powershell 递归 WMI 查询

我想从 WMI 命名空间的顶部开始,递归遍历所有对象,然后递归遍历每个对象的属性列表,过滤掉并仅返回到控制台具有内存以他们的名义。

这是我目前所拥有的:

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 添加的注释:我还没有给出答案,因为还没有人提供单行从而解决了问题。

答案1

我认为这可以在一行中完成您要查找的操作。默认情况下,CIMV2 命名空间存在,但如果您想选择其他命名空间,则可以使用 gwmi -namesapce。

“技巧”是在 foreach 对象中嵌套一个 where 对象

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

答案2

它看起来像这样:

gwmi-命名空间“root\cimv2”-列表

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

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

正如您所看到的,我是 PowerShell 初学者,但我认为您可以从中得出“一行”结论。

答案3

我认为通过列出命名空间,您可以获得 WMI CLASS 对象,但不是实际的对象实例 - 您可以通过 gwmi“win32_OperatingSystem”获得该对象实例,如果您使用 gm,您将看到:

类型名称:System.Management。管理类#ROOT\cimv2\Win32_OperatingSystem 与 TypeName:System.Management。管理对象#root\cimv2\Win32_OperatingSystem

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

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

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

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

答案4

下载微软的 Scriptomatic2 和 PowershellScriptomatic。它们都是 hta 应用程序,因此你可以以纯文本形式查看它们,了解它们是如何工作的。

相关内容