Я хотел бы начать с верхней части пространства имен 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, поэтому вы можете просматривать их как простой текст, чтобы увидеть, как они это делают.