Назад | Перейти на главную страницу

Рекурсивный запрос WMI Powershell

Я хотел бы начать с верхней части пространства имен 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' }

Спасибо, и если будет получен рабочий ответ, я воля принять и проголосовать (раздражает, когда люди никогда этого не делают, не так ли?).

Примечание добавлено 14/11/2009: я еще не присудил ответ, потому что никто еще не предоставил один лайнер что решает проблему.

Я думаю, это сделает то, что вы ищете, в одну строку. пространство имен CIMV2 присутствует по умолчанию, но если вы хотите выбрать другое, вы можете использовать gwmi -namesapce.

"Уловка" заключается в том, чтобы разместить объект where в стороне от объекта foreach.

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

Выглядит это так:

gwmi -namespace "root \ cimv2" -list

возвращает массив объектов 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, но думаю, что из этого можно сделать «однострочник».

Я думаю, перечисляя пространство имен, вы получаете объекты 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».

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

Загрузите Microsoft Scriptomatic 2 и Powershell Scriptomatic. Оба они являются приложениями hta, поэтому вы можете просматривать их как простой текст, чтобы увидеть, как они это делают.