Como contar objetos no PowerShell?

139

Enquanto estou lendo o guia do usuário do PowerShell, um dos principais conceitos do PowerShell é que os comandos aceitam e retornam objetos em vez de texto. Por exemplo, a execução get-aliasme devolve vários System.Management.Automation.AliasInfoobjetos:

PS Z: \> get-alias

Nome do CommandType Definição
----------- ---- ----------
Alias% ForEach-Object
Alias? Where-Object
Alias ​​ac Adicionar conteúdo
Alias ​​asnp Add-PSSnapIn
Alias ​​cat Get-Content
Alias ​​cd Set-Location
Alias ​​chdir Set-Location
...

Agora, como obtenho a contagem desses objetos?

ulidtko
fonte

Respostas:

200

Isso fará você contar:

get-alias | measure

Você pode trabalhar com o resultado como com o objeto:

$m = get-alias | measure
$m.Count

E se você gostaria de ter aliases em alguma variável também, você pode usar o Tee-Object:

$m = get-alias | tee -Variable aliases | measure
$m.Count
$aliases

Mais informações sobre o cmdlet Measure-Object estão no Technet .

Não confunda com o cmdlet Measure-Command, que serve para medir o tempo. (novamente na Technet )

jumbo
fonte
3
Eu usei $Counter = $(get-alias | measure).Countcomo sempre retorna o valor 1, caso haja apenas uma ocorrência, exatamente como você disse.
precisa saber é o seguinte
6
Outra opção:get-alias | measure | % { $_.Count }
Shameer
fyi: measureé a abreviação de Measure-Object; e retorna um monte de outras coisas - como Average, Sum, Maximum, etc ...
BrainSlugs83
1
Por que não apenas (gal) .count? Requer PS v3 ou superior IIRC. EDIT: isso já foi respondido.
Uranibaba 6/0318
3
@ Shameer Enquanto estamos nisso, pode-se usar Get-Alias | Measure-Object | Select-Object -ExpandProperty Countpara se livrar de %e {}. O que é mais fácil escrever e ler é para outra discussão.
LosManos
109

Tão curta quanto a resposta do @ jumbo é :-) você pode fazê-lo de maneira ainda mais concisa. Isso apenas retorna a Countpropriedade da matriz retornada pela sub-expressão antecedente:

@(Get-Alias).Count

Alguns pontos a serem observados:

  1. Você pode colocar uma expressão arbitrariamente complexa no lugar de Get-Alias, por exemplo:

    @(Get-Process | ? { $_.ProcessName -eq "svchost" }).Count
  2. O arroba inicial (@) é necessário para uma solução robusta. Enquanto a resposta é dois ou mais você vai obter uma resposta equivalente com ou sem a @, mas quando a resposta é zero ou um que você vai ter nenhuma saída a menos que você tem o sinal @! (Força a Countpropriedade a existir forçando a saída a ser uma matriz.)

01.01.2012

O acima é verdade para o PowerShell V2. Um dos novos recursos do PowerShell V3 é que você possui uma Countpropriedade mesmo para singletons, portanto, o sinal de arroba se torna sem importância para esse cenário.

Michael Sorens
fonte
3
Eu sei que isso é antigo, mas para outros que procuram por isso… v3 + parece não funcionar sem o @ para contagem <2 se Set-StrictMode -Version Latestfor usado. Eu acabei de encontrar isso hoje (em 5.1) - algo funcionou interativamente que não funcionou em uma função. Eu o localizei até a função Set-StrictMode; quando eu defini o modo estrito interativamente, também não funcionou.
vr8ce
Boa captura, @ vr8ce! Eu sou um forte defensor Set-StrictModetambém, então eu deveria ter percebido isso.
Michael Sorens
Para expandir o conselho de @ vr8ce, não pude usar @ ($ myObject) para obter uma contagem de um objeto existente. Então, eu uso um if ($myObject.PSobject.Properties.Name -contains "count")(de stackoverflow.com/questions/26997511/… ) antes de tentar testar a propriedade count. Odeio que o PoSH me faça fazer isso, mas o Modo Estrito vale a pena.
Duct_tape_coder 23/08/19
21

Basta usar parênteses e 'contar'. Isso se aplica ao Powershell v3

(get-alias).count
prabhakaran
fonte
1
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem.
precisa
@Damien OK. Eu fiz a edição. Em SO, as pessoas geralmente vêm da primeira resposta à última. De repente, eles não pulam na terceira resposta e ficam confusos. Para que eu fiz isso como uma continuação das duas primeiras respostas. Essa resposta faz mais sentido do que esta editada.
Prabhakaran
1
Isso já está coberto nesta resposta . Você basicamente está re-repetindo o que já foi dito dois anos depois de ter sido dito.
Liam
1
@ Liam Essa resposta é para o powershell v2. Minha resposta é para o PowerShell v3. Como você disse, esta resposta é abordada / contada literalmente na atualização (atualização de 2012.01.30) nessa resposta. Acabei de dar a parte de codificação.
Prabhakaran
5

@($output).Countnem sempre produz resultados corretos. Eu usei o ($output | Measure).Countmétodo

Encontrei isso com o cmdlet VMware Get-VmQuestion:

$output = Get-VmQuestion -VM vm1
@($output).Count

A resposta que deu é uma, enquanto

$output

não produziu saída (a resposta correta foi 0, conforme produzido com o Measuremétodo).

Esse parecia ser o caso apenas de 0 e 1. Qualquer coisa acima de 1 estava correta com testes limitados.

bchris999
fonte
Chris, acho que para conseguir o que você queria, seria necessário fazer isso: @ (Get-VmQuestion -VM vm1) .count Você não pode forçar a saída a ser uma matriz ... uma vez que a saída já esteja feita . É isso que você está fazendo.
31416 Daniel Peel