Olá pessoal, tudo bem? Espero que sim!

Nos últimos posts citei bastante um termo usado no Powershell que é diretamente ligado às ações dos cmdlets ou funções, mas ainda não abordei devidamente os seus conceitos e aplicabilidades. Hoje vamos conhecer como o Powershell trabalha com Objetos.

O que é um Objeto no contexto do Powershell?

Um Objeto é a representação de qualquer componente que possui características ou propriedades, e ações que permitem mudar os estados destas propriedades.

O sistema operacional Windows é composto por diversos serviços com propriedades e diversos métodos de ação para manipulá-las. Por exemplo, para alterar o estado de execução de um serviço, precisamos usar os métodos existentes Iniciar ou Parar para mudar a propriedade Status para o estado de Em Execução ou Parado. Observe a seguinte estrutura:

Desta forma, podemos considerar os serviços do Windows como Objetos no Powershell.

Exemplo 1:

No exemplo acima, utilizamos o cmdlet Get-Service para retornar as propriedades do serviço Windows Update, em seguida, usamos o cmdlet Set-Service para alterar o estado de execução para Em Execução e em seguida, usamos novamente o cmdlet Get-Service para validamos a efetividade da operação. Com os verbos Get e Set, podemos executar métodos para retornar ou alterar as propriedades do Objeto Service do Windows, mudando a forma como o componente está trabalhando. Na prática, é a mesma operação que realizamos ao entrarmos na console de Serviços do Windows, clicar com o botão direito no serviço Windows Update e clicar em Iniciar.

Se observamos de forma holística, praticamente tudo o que trabalharmos no Powershell que possuírem métodos e propriedades são Objetos.

Exemplo 2:

Usamos no exemplo acima o cmdlet Get-Item para retornar as propriedades do arquivo script.txt. O sistema operacional Windows utiliza o Objeto FileSystemObject, representado pelos seus cmdlets para manipular quaisquer arquivos do sistema operacional o que permite alterar características de um arquivo ou até mesmo o seu conteúdo. Observe a seguinte estrutura:

Como vimos no post #2, nem sempre o cmdlet que permite uma alteração de um Objeto começa com o verbo Set. O objeto FileSystemObject, por exemplo, utiliza verbos como Rename, Move, Copy New para respectivamente renomear arquivos, mover ou copiá-lo para outro diretório e criar um novo arquivo. Para alterar o conteúdo de um arquivo de texto, podemos usar o cmdlet Set-Content.

Exemplo:

Com estas informações podemos concluir que a principal função de um cmdlet ou função é ser um atalho para invocar métodos de algum Objeto existente para realizar alguma operação em suas propriedades.

Acredito que agora bastante dos conhecimentos que abordamos até então passem a fazer mais sentido para vocês.

Propriedades de Objetos

Como vimos anteriormente neste post, os Objetos são componentes que possuem propriedades e métodos. As propriedades são atributos de configuração que nos indicam um estado para uma parte de um Objeto e consultá-las é uma tarefa bem simples. Todos os cmdlets iniciados pelo verbo Get, retornarão as propriedades de um Objeto.

Exemplo:

Como identificar as propriedades e métodos de um Objeto

Para identificar todas as propriedades e métodos disponíveis em um Objeto, basta utilizar o cmdlet Get-Member. Ao ser executado, o comando retornará uma lista com todos os itens membros do Objeto, classificados pelo seu tipo e as informações das definições de como o membro é constituído.

Sintaxe: Get-Member -InputObject <Objeto> -MemberType <tipodemembro>

Exemplo 1:

Como podem observar no exemplo acima, ao executar o cmdlet Get-Member indicando o cmdlet Get-Service como Objeto de entrada, foi retornado em sua maioria métodos. Isto ocorreu porque ao especificar explicitamente o parâmetro -InputObject seguido do Objeto, eu não instanciei (ou executei) o cmdlet Get-Service para o devido retorno de suas propriedades, portanto, somente foram retornados os métodos de ação disponíveis para se trabalhar com o Objeto em análise.

Para visualizar corretamente as propriedades, você precisa iniciar uma instância do Objeto e repassar suas propriedades para o Get-Member utilizando o Pipeline.

Sintaxe: <Objeto> | Get-Member

Exemplo 2:

Desta forma, podemos identificar todas as propriedades disponíveis para o cmdlet Get-Service.

Você ainda pode filtrar os resultados do comando pelo tipo de membro do Objeto. Para isto, basta atribuir o parâmetro -MemberType e informar qual tipo de  membro deverá ser retornado. Se deseja retornar mais de um tipo, basta adicioná-lo separado por vírgula.

Exemplo 3:

Tipos de Membros de Objetos

Podemos ter diversos tipos de membros em um Objeto. Para entender melhor quais são os tipos disponíveis e o que são, observe a tabela a seguir:

Tipo de Membro Descrição
AliasProperty Retorna os Aliases atribuídos para o membro
All Retorna todos os tipos de membros disponíveis
CodeMethod Retorna os métodos definidos como uma referência a outros métodos existentes
CodeProperty Retorna uma propriedade definida como uma referência a um método existente
Dynamic Retorna todos os membros dinâmicos
Event Retorna todos os eventos
InferredProperty Retorna os membros definidos por inferência de tipos para PSObject e Hashtable
MemberSet Retorna um conjunto de membros
Method Retorna um método do BaseObject
Methods Retorna todos os tipos de membros do método
NoteProperty Retorna uma propriedade definida por um par nome-valor
ParameterizedProperty Não considerado uma propriedade ou um método, retorna um membro que age como uma propriedade que recebe parâmetros
Properties Retorna todos os tipos de membros da propriedade
Property Retorna uma propriedade do BaseObject
PropertySet Retorna um conjunto de propriedades
ScriptMethod Retorna um método definido como um script
ScriptProperty Retorna uma propriedade definida pela linguagem de script

Para mais informações sobre o cmdlet Get-Member, você pode consultar a documentação de referência técnica no site da Microsoft.

Nem todas as propriedades estão sendo exibidas, e agora?

Fique tranquilo, quando concebidos, alguns Objetos deixam algumas propriedades ocultas por padrão, somente exibindo as informações mais relevantes àquele Objeto. Você pode usar o cmdlet Format-List para poder exibir todas as propriedades de um Objeto.

Sintaxe: Get-<comando> | Format-List -Property <propriedade>

Exemplo:

Ao utilizar o pipeline e incluir o cmdlet Format-List com o parâmetro -Property *, estou indicando ao shell que quero formatar a saída do comando como uma lista e que ele retorne todas as propriedades, onde * é interpretado como Wildcard (Curinga ou simplesmente todas as propriedades disponíveis). Da mesma forma, se você desejar retornar apenas uma propriedade específica, você pode especificá-la após o parâmetro -Property.

Exemplo:

Quais tipos de valores podem existir nas propriedades de um Objeto?

Podemos atribuir quaisquer valores para propriedades de Objetos, seja ele texto, número, data, hexadecimal, xml, etc, desde que a propriedade que você está alterando aceite este formato, do contrário, você receberá algum erro de incompatibilidade do formato do valor que está tentando atribuir a propriedade.

Exemplo:

ValidateSet

Existem propriedades que na verdade são parâmetros com um conjunto de valores predefinidos para alterar o estado de uma propriedade, este conjunto de valores é conhecido como ValidateSet. Caso o valor atribuído não seja um dos disponíveis, será retornado um erro.

Exemplo:

Como puderam observar no exemplo acima, tentei alterar o estado de execução do serviço W32Time para 0, contudo, foi retornada uma mensagem de erro informando que “O argumento (valor) “0” não pertence ao conjunto “Running;Stopped;Paused”“, ou seja, somente podemos atribuir os valores Running, Stopped ou Paused para a propriedade Status.

Conclusão

Acredito que este post tenha sido bastante esclarecedor da forma como o Powershell manipula os componentes do sistema operacional Windows ou de algum módulo específico ou mesmo um produto. A Microsoft disponibiliza métodos em praticamente todos os seus produtos, então quando falamos de Active Directory, Exchange, System Center, Sharepoint, Office 365, etc, todos possuem Objetos com propriedades e métodos que nos permite facilmente gerenciar e manipular suas configurações e estados por simples instruções de códigos simplificadas. Utilizando tudo o que aprendemos até agora, podemos facilmente criar diversas instruções para conduzir uma mudança de estado de qualquer componente de forma assertiva e automatizada, mitigando quaisquer falhas oriundas de erro humano.

É isso aí galera, por hoje é só. Até o próximo post!

Dúvidas, sugestões, críticas? Entre em contato aqui!

Gostou? Deixe seu comentário e não se esqueçam de curtir a página do Facebook na barra lateral!