O PowerShell é uma linguagem poderosa. Mas o que torna essa linguagem de script tão poderosa? Objetos do PowerShell. O que são esses objetos mágicos e como o PowerShell trabalha com eles? Continue ligado para descobrir.
O PowerShell é uma linguagem orientada a objetos e shell. Isso é uma partida dos shells tradicionais como cmd e Bash. Esses shells tradicionais se concentravam em texto, também conhecido como strings, e embora ainda sejam úteis, são limitados em suas capacidades. Quase tudo no PowerShell é um objeto.
Neste artigo, você aprenderá alguns conceitos-chave quando se trata de objetos no PowerShell. Até o final deste artigo, você terá aprendido como aplicar esse conhecimento ao seu próprio script por meio de exemplos de código úteis e visualizações.
Se você é mais um aprendiz visual, sinta-se à vontade para assistir ao vídeo complementar deste artigo abaixo.
Então, prepare-se! Você está prestes a ter uma experiência memorável que o ajudará a dominar o conceito de objetos no PowerShell!
Pré-requisitos
Neste artigo, você vai aprender sobre objetos no PowerShell por meio de uma abordagem prática. Se você optar por acompanhar e experimentar os exemplos de código, o Windows PowerShell 5.1 ou qualquer versão do PowerShell 6+ deverá funcionar. No entanto, todos os exemplos que você verá serão realizados no Windows 10 build 1903 com o Windows PowerShell 5.1.
Compreendendo a Anatomia de um Objeto
Objetos estão por toda parte no PowerShell. Você pode estar se perguntando “Como é a aparência de um objeto?”. Nesta primeira seção, você terá uma visão geral do que constitui um objeto. Assim que tiver uma visão ampla do que torna um objeto um objeto, você poderá mergulhar em alguns exemplos de código!
Descobrindo os Membros do Objeto com Get-Member
Objetos têm muitos tipos diferentes de informações associadas a eles. No PowerShell, essas informações são às vezes chamadas de membros. Um membro de um objeto é um termo genérico que se refere a todas as informações associadas a um objeto.
Para descobrir informações sobre um objeto (membros), você pode usar o cmdlet Get-Member
. O cmdlet Get-Member
é um comando útil que permite encontrar propriedades, métodos e assim por diante para qualquer objeto no PowerShell.
Por exemplo, digamos que você queira ver os membros de um objeto específico retornado pelo cmdlet Get-Service
. Você pode fazer isso encadeando a saída do comando Get-Service
para o cmdlet Get-Member
, como mostrado abaixo.
Acostume-se com o cmdlet Get-Member
. Você vai usá-lo bastante neste artigo.
Cada comando no PowerShell que gera saída pode ser encadeado para o
Get-Member
. Apenas lembre-se de colocar este cmdlet como o último na sequência, pois ele substituirá a saída com sua própria saída.
Tipos de Objetos e Classes
Sem entrar em muitos detalhes sobre programação orientada a objetos, cada objeto possui um “esquema”. O “esquema” de um objeto é uma espécie de modelo que contém a planta para criar um objeto. Essa planta é chamada de tipo.
Cada objeto no PowerShell possui um tipo específico. Cada objeto tem uma planta a partir da qual foi criado. O tipo de objeto é definido por uma classe. Considere este exemplo; 9 é número, Bluegill é peixe, Labrador é cão, etc. A classe vem antes do tipo.
Objetos são instâncias de classes com um tipo específico.
Não se preocupe em se aprofundar muito neste tópico. A menos que você seja um desenvolvedor de software, provavelmente não precisa se preocupar muito com a semântica neste ponto. No entanto, é um conceito importante para conhecer em um nível básico.
Propriedades
O conceito mais importante sobre objetos que você deve entender é o de propriedades. Propriedades são atributos que descrevem um objeto. Um objeto pode ter muitas propriedades diferentes que representam vários atributos.
Uma das maneiras mais fáceis de descobrir quais propriedades existem nos objetos é usar o cmdlet Get-Member
. Você pode ver abaixo que, ao usar o parâmetro MemberType
, Get-Member
limitará a saída retornada apenas para objetos. Você também verá que ele exibe o tipo de objeto System.ServiceProcess.ServiceController como.

Agora, pegue o exemplo do serviço BITS mencionado anteriormente e veja os valores específicos das propriedades desse objeto usando o código abaixo. O cmdlet Get-Member
permite que você encontre os nomes das propriedades, mas não os valores. No entanto, usando o cmdlet Select-Object
do PowerShell, você pode inspecionar os valores das propriedades.
Abaixo, você pode ver que StartType
é uma propriedade do objeto. O objeto retornado tem muitos membros diferentes, mas ao usar o cmdlet Select-Object
, está limitando a saída para mostrar apenas essa propriedade.

As propriedades são, de longe, o componente mais comum de um objeto com o qual você trabalhará no PowerShell.
Aliases
Algumas propriedades têm um MemberType
de Alias
. Aliases são pseudônimos para nomes de propriedades. Às vezes, eles podem dar nomes mais intuitivos às propriedades.
Você pode ver um exemplo de um objeto com aliases usando novamente o cmdlet Get-Service
, conforme mostrado abaixo. A propriedade Name
é aliada a ServiceName
e RequiredServices
é aliada à propriedade ServicesDependedOn
.

Quando uma propriedade tem um alias, você pode referenciar o valor dessa propriedade usando o nome do alias em vez do nome da propriedade real. Neste exemplo, um atributo descritivo como Name
e RequiredServices
é mais intuitivo e mais fácil de digitar do que ServiceName
e ServicesDependedOn
.
Você pode ver um exemplo de referência a esses aliases abaixo.
Você deverá ver a seguinte saída. Observe novamente que você está mantendo o código curto, limpo e conciso. A informação é a mesma, independentemente de usar o alias ou não:

Métodos
Propriedades são apenas uma parte que cria um objeto; métodos também são um conceito importante de entender. Métodos são as ações que podem ser realizadas em um objeto. Assim como as propriedades, você pode descobrir métodos em um objeto usando o cmdlet Get-Member
.
Para limitar a saída do Get-Member
apenas para métodos, defina o valor do parâmetro MemberType
como Method
, como mostrado abaixo.

Como iniciante, você usará os métodos muito menos frequentemente do que as propriedades.
Outros Tipos de Membros
Propriedades, métodos e aliases não são os únicos tipos de membros que um objeto pode ter. No entanto, eles serão, de longe, o tipo mais comum de membros com os quais você estará trabalhando.
Para completude, abaixo estão alguns outros tipos de membros que você pode encontrar.
- Propriedade de Script – Estas são usadas para calcular valores de propriedade.
- Propriedade de Nota – Estas são usadas para nomes de propriedade estáticos.
- Conjuntos de Propriedades – Estes são como alias que contêm exatamente o que o nome implica; conjuntos de propriedades. Por exemplo, você criou uma propriedade personalizada chamada
Specs
para sua funçãoGet-CompInfo
.Specs
é na verdade um subconjunto das propriedades Cpu, Mem, Hdd, IP. O objetivo principal dos conjuntos de propriedades é fornecer um único nome de propriedade para concatenar um grupo de propriedades.
Itambém é importante mencionar o conceito de eventos de objeto. Eventos estão fora do escopo deste artigo.
Trabalhando com Objetos no PowerShell
Agora que você tem uma compreensão básica do que consiste um objeto, vamos começar a colocar a mão na massa e entrar em algum código.
Muitos comandos do PowerShell produzem saída, mas às vezes você não precisa ver toda essa saída. Você precisa limitar ou manipular essa saída de alguma forma. Felizmente, o PowerShell tem alguns comandos diferentes que permitem fazer exatamente isso.
Vamos começar com um exemplo de enumeração de todos os serviços no computador local usando o cmdlet Get-Service
conforme mostrado abaixo. Você pode ver pela saída que muitos serviços diferentes (objetos) são retornados.

Controlando Propriedades de Objetos Retornados
Continuando com o exemplo do Get-Service
, talvez você não precise ver cada propriedade. Em vez disso, você só precisa ver as propriedades Status
e DisplayName
. Para limitar as propriedades retornadas, você usaria o cmdlet Select-Object
.
O cmdlet Select-Object
“filtra” várias propriedades para não serem retornadas para o pipeline do PowerShell. Para “filtrar” as propriedades do objeto a serem retornadas, você pode usar o parâmetro Property
e especificar um conjunto de uma ou mais propriedades separadas por vírgula.
Você pode ver abaixo um exemplo de retornar apenas as propriedades Status
e DisplayName
.

Ordenando Objetos
Talvez você esteja construindo um relatório para mostrar serviços e seus estados. Para facilitar a digestão da informação, você gostaria de ordenar os objetos retornados pelo valor da propriedade Status
. Para fazer isso, você pode usar o cmdlet Sort-Object
.
O cmdlet Sort-Object
permite que você colete todos os objetos retornados e os apresente na ordem que você define.
Por exemplo, usando o parâmetro Property
do Sort-Object
, você pode especificar uma ou mais propriedades nos objetos de entrada de Get-Service
para ordenar. O PowerShell passará cada objeto para o cmdlet Sort-Object
e os retornará ordenados pelo valor da propriedade.
Você pode ver abaixo um exemplo de retornar todos os objetos de serviço ordenados pela propriedade Status
devidamente retornados em ordem decrescente usando o parâmetro de comutação Descending
do Sort-Object
.

O pipe [
|
] no PowerShell é uma das técnicas de continuação de linha que você deve usar quando necessário. Use-o em vez de acentos graves.
Filtrando Objetos
Talvez você decida que não deseja ver todos os serviços em uma máquina. Em vez disso, você precisa limitar a saída por critérios específicos. Uma maneira de filtrar o número de objetos retornados é usando o cmdlet Where-Object
.
Enquanto o cmdlet Select-Object
limita a saída de propriedades específicas, o cmdlet Where-Object
limita a saída de objetos inteiros.
O cmdlet Where-Object
é semelhante em função à cláusula WHERE do SQL. Age como um filtro na fonte original, retornando apenas objetos específicos que correspondem a critérios específicos.
Talvez você decida que deseja apenas objetos com um valor de propriedade Status
igual a Running
e apenas aqueles com um valor de propriedade DisplayName
que começa com A
.
Como pode ser visto no trecho de código seguinte, uma referência ao Where-Object
foi inserida entre Select-Object
e Sort-Object
na ordem da canalização. Usando um valor de scriptblock com uma condição necessária criada para cada objeto atender via o parâmetro FilterScript
, você pode criar qualquer tipo de consulta desejada.
Confira o cmdlet
Format-Table
se quiser manipular como a saída é retornada ao console.

Contagem e Média de Objetos Retornados
O comando Get-Service
retorna muitos objetos diferentes. Usando o cmdlet Where-Object
, você filtrou uma parte desses objetos, mas quantos? Apresentando o cmdlet Measure-Object
.
O cmdlet Measure-Object
é um comando do PowerShell que, entre outras operações matemáticas, pode contar quantos objetos ele recebe via pipeline.
Talvez você queira saber quantos objetos são eventualmente retornados quando seus comandos combinados são executados. Você pode encadear a saída final para o cmdlet Measure-Object
para encontrar o número total de objetos retornados, como mostrado abaixo.
Uma vez que os comandos terminarem de processar, você verá, neste caso, que inicialmente foram retornados 21 objetos criados com o cmdlet Get-Service
.

Talvez você esteja apenas procurando pelos objetos totais retornados. Como o comando Measure-Object
retorna os objetos totais encontrados através de uma propriedade Count
, você pode fazer referência ao cmdlet Select-Object
novamente. Mas desta vez, retornando apenas a propriedade Count
.

Tomando Ação em Objetos com Loops
À medida que cada objeto é processado via pipeline, você pode tomar ação em cada objeto com um loop. Existem diferentes tipos de loops no PowerShell, mas mantendo-se com exemplos de pipeline, vamos dar uma olhada no cmdlet ForEach-Object
.
O cmdlet ForEach-Object
permite que você tome ação em cada objeto que flui para ele. Esse comportamento é melhor explicado com um exemplo.
Continuando a usar um exemplo de Get-Service
, talvez você queira encontrar todos os serviços em um computador com Windows com um nome que comece com “Windows” e esteja em execução. Usando o cmdlet Where-Object
, você pode criar as condições como fez anteriormente.
Mas agora, em vez de retornar objetos inteiros ou mesmo algumas propriedades, você gostaria de retornar a string <ServiceName> está em execução para cada objeto usando o código **Write-Host -ForegroundColor 'Yellow' <ServiceName> "is running"
.
Agora você está manipulando a saída e criando sua própria string. A única maneira de fazer isso é usar o cmdlet ForEach-Object
, conforme mostrado abaixo. Abaixo você pode ver que para cada objeto retornado via Where-Object
, o PowerShell executa o código Write-Host -ForegroundColor 'Yellow' $_.DisplayName "is running"
.

O cmdlet ForEach-Object
é útil de muitas maneiras. Como exemplo, você poderia incorporar lógica adicional para enumerar cada objeto de serviço encontrado e, com base em um valor de propriedade, mudar a cor e o texto da string de saída ou até mesmo realizar uma ação adicional, como iniciar um serviço interrompido.
Imagine as possibilidades que isso oferece para você! Com um pouco de reflexão e planejamento, você poderia criar um script que execute facilmente um comando em muitos objetos.
Comparando Objetos
Às vezes, é necessário olhar para dois objetos e comparar os valores das propriedades.
Talvez você tenha dois sistemas na sua rede que sejam quase idênticos. No entanto, você está enfrentando o que espera ser um problema de configuração com um serviço em um dos dois sistemas.
Você conclui que, como esses sistemas estão em partes diferentes da sua rede, será necessário usar comandos remotos para reunir as informações em uma sessão do PowerShell. Você abre seu editor favorito e cria um script. Este script, como você pode ver abaixo, conecta-se a dois servidores diferentes e enumera todos os processos em cada um deles.
Agora você capturou todos os processos em cada computador nas variáveis $ProcA
e $ProcB
. Agora você precisa compará-los. Você poderia procurar manualmente em cada conjunto de processos, ou poderia fazer isso de forma fácil usando um cmdlet chamado Compare-Object
.
Compare-Object
permite que você compare os valores das propriedades de dois objetos diferentes. Este cmdlet lê cada propriedade em cada objeto, verifica seus valores e então retorna o que é diferente, por padrão, e também o que é igual.
Para usar Compare-Object
, especifique um parâmetro ReferenceObject
e um parâmetro DifferenceObject
, fornecendo cada objeto como os valores do parâmetro, como mostrado abaixo.
Por padrão, Compare-Object
só retornará diferenças nos objetos indicados pela propriedade SideIndicator
. Os símbolos ou indicadores laterais usados são >
, <
, e =
para mostrar as correspondências dos objetos sendo comparados.

Você pode usar o parâmetro de comutação
IncludeEqual
comCompare-Object
para retornar as propriedades do objeto que são iguais. Se sim, você verá==
como indicador lateral. Da mesma forma, você pode usarExcludeDifferent
para excluir diferenças.
O cmdlet Compare-Object
é um cmdlet muito útil. Se você quiser aprender mais, não deixe de visitar a documentação online.
Trabalhando com Objetos Personalizados
Agora que você tem uma boa compreensão do que são objetos e como pode trabalhar com eles, é hora de criar seus próprios objetos!
Criando Objetos Personalizados a partir de Hashtables
Uma maneira de criar seus próprios objetos é usando hashtables. Hashtables são conjuntos de pares chave/valor, exatamente o que você precisa para criar propriedades para um objeto.
Vamos começar criando um objeto personalizado do PowerShell com algumas chaves/valores usando uma hashtable. No exemplo abaixo, você está criando uma hashtable. Esta hashtable está representando um único objeto e suas propriedades. Depois que a hashtable $CarHashtable
for definida, você pode usar o PsCustomObject
como acelerador de tipo.
O acelerador de tipo pscustomobject é uma maneira rápida de criar uma instância da classe pscustomobject. Esse comportamento é chamado de casting.
Ao final do trecho de código abaixo, você terá um objeto ($CarObject
) do tipo pscustomobject com cinco propriedades atribuídas a ele.
Alternativamente, você também pode usar o cmdlet New-Object
. Usando o mesmo hashtable, em vez de usar o acelerador de tipo pscustomobject, você pode fazer isso da forma longa com New-Object
. Um exemplo disso é mostrado abaixo.
Ao criar $CarObject
, você pode ver abaixo que pode referenciar cada uma das propriedades como se fosse proveniente de um cmdlet PowerShell integrado, como Get-Service
.

Adicionando e Removendo Propriedades
Não só é possível criar objetos personalizados, mas também adicionar a eles. Lembra do uso do cmdlet Get-Member
? Get-Member
tem um relativo chamado Add-Member
. O cmdlet Add-Member
não enumera membros, ele adiciona a eles.
Usando o objeto personalizado criado anteriormente como exemplo, talvez você queira adicionar uma propriedade de ano do modelo a esse objeto. Você pode fazer isso enviando um objeto para Add-Member
especificando:
- O tipo de membro (neste caso, um simples
NoteProperty
) - O nome da propriedade (
Ano
) - O valor da propriedade (
Valor
)
Você pode ver um exemplo disso abaixo.
Você pode ver abaixo novamente que parece como qualquer outra propriedade.

Você pode usar técnicas semelhantes para adicionar muitos tipos diferentes de membros. Se quiser explorar mais por conta própria, dê uma olhada na documentação
de Adicionar Membro.
Você pode remover um membro de um objeto com a mesma facilidade. Embora não haja um cmdlet Remover-Membro
, você ainda pode fazer isso chamando o método Remove()
no objeto, conforme mostrado abaixo. Você aprenderá sobre métodos na próxima seção.
Introdução rápida aos Métodos
Ao longo deste artigo, você esteve trabalhando com propriedades. Você leu valores de propriedade, criou suas próprias propriedades e as adicionou e removeu. Mas você não fez muita coisa no ambiente. Você não mudou nada no servidor. Vamos tomar alguma ação com métodos.
Os métodos realizam algum tipo de ação. Os objetos armazenam informações enquanto os métodos tomam ação.
Por exemplo, você pode estar ciente do comando Parar-Serviço
. Este comando para um serviço do Windows. Para fazer isso, você pode enviar um objeto do Obter-Serviço
diretamente para Parar-Serviço
para fazer isso acontecer.
Você pode ver abaixo um exemplo de como parar o serviço BITS. Este exemplo para o serviço BITS e então verifica o status para garantir que esteja parado. Você realizou duas ações com cmdlets; parando o serviço e verificando o status.
Em vez de executar Get-Service
duas vezes e executar um comando separado, Stop-Service
, em vez disso, você pode aproveitar métodos que estão integrados nos objetos de serviço. Muitos objetos têm métodos. Neste caso, Stop-Service
e essa segunda referência Get-Service
nem sequer são necessárias.

Ao invocar métodos no próprio objeto de serviço, você pode parar e recuperar o status atualizado usando um único objeto. Abaixo você pode ver isso em ação. Note que ao usar os métodos Stop()
e Start()
, você pode manipular o serviço da mesma forma que os comandos fizeram.
Para garantir que o valor da propriedade Status
esteja atualizado após o status do serviço ter mudado, você pode invocar o método Refresh()
que age como outra chamada de comando Get-Service
.
Você deverá ver a seguinte saída:

Para obter mais informações sobre métodos, confira o tópico de ajuda sobre_Métodos.
Conclusão
Há muitas coisas que você pode fazer com objetos no PowerShell. Este artigo foi apenas um guia introdutório para começar a aprendê-los. Neste artigo, você aprendeu alguns dos conceitos básicos sobre o que são objetos, como agir, manipulá-los e criá-los. Você viu alguns cenários diferentes que mostraram como realizar essas tarefas com exemplos de código. Mantenha a calma e aprenda PowerShell. Obrigado por ler!