Consulta WMI recursiva do Powershell

6

Gostaria de começar na parte superior de um espaço para nome WMI, recorrer a todos os objetos e recorrer à lista de propriedades de cada objeto, filtrando e retornando ao console apenas as propriedades que possuem mem em seus nomes.

Isso é o que eu tenho até agora:

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

Observe o grande | ???? no meio lá. Se eu remover isso, o comando parece para ser executado, mas não consegue encontrar as propriedades que eu sei que devem ser encontradas. Por quê? Eu acho que é porque recebo saída diferente dos dois comandos a seguir:

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)

O que eu quero é um one-liner que concatene recursivamente esse processo:

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

Obrigado, e se uma resposta de trabalho for dada, eu vou aceitar e fazer upvote (chato quando as pessoas nunca fazem isso, não é?).

Nota adicionada 14/11/2009: Ainda não concedi a resposta porque ninguém ainda forneceu um one-liner que resolva o problema.

    
por quux 02.09.2009 / 12:30

5 respostas

7

Acho que isso fará o que você está procurando em uma linha. o namespace CIMV2 está lá por padrão, mas se você quiser selecionar um diferente, você pode usar gwmi -namesapce.

O "truque" é aninhar um where-object no lado foreach-object

gwmi -list | % {$_.Properties | ? {$_.Name.Contains('Memory')}} | select Origin,Name
    
por 01.12.2009 / 17:12
2

Parece assim:

gwmi -namespace "root \ cimv2" -list

retorna uma matriz de objetos ManagementClass .Net, para que você possa usar a coleção ManagementClass.Properties para selecionar propriedades que tenham uma determinada string em seus nomes. Aqui está o meu script do PowerShell:

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

Como você pode ver, eu sou um iniciante no PowerShell, mas acho que você pode fazer um 'one-liner' a partir disso.

    
por 03.09.2009 / 21:17
1

Acho que listando o namespace você obtém os Objetos WMI CLASS, mas não as instâncias de objetos reais - que você obtém com gwmi "win32_OperatingSystem" Se você usar gm, verá:

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

edite: Você poderia fazer algo assim:

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

e se você quiser todas as propriedades com mem *, então você poderia tentar | select-object "mem*"

mas não tenho certeza se isso é realmente o que você quer. Eu acho que isso é muito ineficaz se você só precisa saber a quantidade de memória. O que você realmente quer ter como saída?

    
por 02.09.2009 / 13:59
1

Está um pouco atrasado aqui, mas tenho certeza de que o abaixo irá levá-lo até onde você deseja obter - que é uma listagem de todas as propriedades no namespace do WMI que possuem "mem" em seu nome

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

Faça o download do Microsoft Scriptomatic2 e do PowershellScriptomatic. Ambos são aplicativos hta, então você pode visualizá-los como texto simples para ver como eles fazem isso.

    
por 24.09.2011 / 03:04