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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# Consultar Status de Execução de Serviço do Windows PS C:\Users\RobotChicken> Get-Service -Name wuauserv Status Name DisplayName ------ ---- ----------- Stopped wuauserv Windows Update # Alterar Status de execução de Serviço do Windows para Iniciado PS C:\Users\RobotChicken> Set-Service -Name wuauserv -Status Running # Consultar Status de Execução de Serviço do Windows PS C:\Users\RobotChicken> Get-Service -Name wuauserv Status Name DisplayName ------ ---- ----------- Running wuauserv Windows Update |
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:
1 2 3 4 5 6 7 |
PS C:\Users\RobotChicken> Get-Item .\script.txt Diretório: C:\Users\RobotChicken Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 07/07/2019 15:35 12 script.txt |
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 e 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# Cria um novo arquivo PS C:\Users\RobotChicken> New-Item arquivo.txt Diretório: C:\Users\RobotChicken Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 20/07/2019 10:59 0 arquivo.txt # Renomeia o arquivo criado para novoarquivo PS C:\Users\RobotChicken> Rename-Item arquivo.txt -NewName novoarquivo.txt # Valida se o arquivo foi renomeado PS C:\Users\RobotChicken> Get-Item novoarquivo.txt Diretório: C:\Users\RobotChicken Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 20/07/2019 10:59 0 novoarquivo.txt # Cria uma cópia do novoarquivo.txt na pasta Desktop PS C:\Users\RobotChicken> Copy-Item novoarquivo.txt -Destination C:\Users\RobotChicken\Desktop # Valida a cópia do novoarquivo.txt na pasta Desktop PS C:\Users\RobotChicken> Get-Item C:\Users\RobotChicken\Desktop\novoarquivo.txt Diretório: C:\Users\RobotChicken\Desktop Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 20/07/2019 10:59 0 novoarquivo.txt # Remove o arquivo renomeado da pasta atual PS C:\Users\RobotChicken> Remove-Item novoarquivo.txt # Valida se o arquivo da pasta atual foi removido PS C:\Users\RobotChicken> Get-Item novoarquivo.txt Get-Item : Não é possível localizar o caminho 'C:\Users\RobotChicken\novoarquivo.txt' porque ele não existe. No linha:1 caractere:1 + Get-Item novoarquivo.txt + ~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (C:\Users\RobotChicken\novoarquivo.txt:String) [Get-Item], ItemNotFoundException + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetItemCommand # Move o item copiado para a pasta Desktop novamente para a pasta atual PS C:\Users\RobotChicken> Move-Item C:\Users\RobotChicken\Desktop\novoarquivo.txt -Destination C:\Users\RobotChicken # Valida se o arquivo copiado para a pasta Desktop foi movido para a pasta atual PS C:\Users\RobotChicken> Get-Item novoarquivo.txt Diretório: C:\Users\RobotChicken Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 20/07/2019 10:59 0 novoarquivo.txt # Define o texto Hello World! como conteúdo do novoarquivo.txt PS C:\Users\RobotChicken> Set-Content novoarquivo.txt -Value "Hello World!" # Consulta o conteúdo definido para o novoarquivo.txt PS C:\Users\RobotChicken> Get-Content novoarquivo.txt Hello World! |
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:
1 2 3 4 5 |
PS C:\Users\RobotChicken> Get-Service W32Time Status Name DisplayName ------ ---- ----------- Running W32Time Horário do Windows |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
PS C:\Users\RobotChicken> Get-Member -InputObject Get-Service TypeName: System.String Name MemberType Definition ---- ---------- ---------- Clone Method System.Object Clone(), System.Object ICloneable.Clone() CompareTo Method int CompareTo(System.Object value), int CompareTo(string strB), int IComparable.CompareTo(System.Object obj), int IComparable[string].Comp... Contains Method bool Contains(string value) CopyTo Method void CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count) EndsWith Method bool EndsWith(string value), bool EndsWith(string value, System.StringComparison comparisonType), bool EndsWith(string value, bool ignoreC... Equals Method bool Equals(System.Object obj), bool Equals(string value), bool Equals(string value, System.StringComparison comparisonType), bool IEquata... GetEnumerator Method System.CharEnumerator GetEnumerator(), System.Collections.IEnumerator IEnumerable.GetEnumerator(), System.Collections.Generic.IEnumerator[... GetHashCode Method int GetHashCode() GetType Method type GetType() GetTypeCode Method System.TypeCode GetTypeCode(), System.TypeCode IConvertible.GetTypeCode() IndexOf Method int IndexOf(char value), int IndexOf(char value, int startIndex), int IndexOf(char value, int startIndex, int count), int IndexOf(string v... IndexOfAny Method int IndexOfAny(char[] anyOf), int IndexOfAny(char[] anyOf, int startIndex), int IndexOfAny(char[] anyOf, int startIndex, int count) Insert Method string Insert(int startIndex, string value) IsNormalized Method bool IsNormalized(), bool IsNormalized(System.Text.NormalizationForm normalizationForm) LastIndexOf Method int LastIndexOf(char value), int LastIndexOf(char value, int startIndex), int LastIndexOf(char value, int startIndex, int count), int Last... LastIndexOfAny Method int LastIndexOfAny(char[] anyOf), int LastIndexOfAny(char[] anyOf, int startIndex), int LastIndexOfAny(char[] anyOf, int startIndex, int c... Normalize Method string Normalize(), string Normalize(System.Text.NormalizationForm normalizationForm) PadLeft Method string PadLeft(int totalWidth), string PadLeft(int totalWidth, char paddingChar) PadRight Method string PadRight(int totalWidth), string PadRight(int totalWidth, char paddingChar) Remove Method string Remove(int startIndex, int count), string Remove(int startIndex) Replace Method string Replace(char oldChar, char newChar), string Replace(string oldValue, string newValue) Split Method string[] Split(Params char[] separator), string[] Split(char[] separator, int count), string[] Split(char[] separator, System.StringSplitO... StartsWith Method bool StartsWith(string value), bool StartsWith(string value, System.StringComparison comparisonType), bool StartsWith(string value, bool i... Substring Method string Substring(int startIndex), string Substring(int startIndex, int length) ToBoolean Method bool IConvertible.ToBoolean(System.IFormatProvider provider) ToByte Method byte IConvertible.ToByte(System.IFormatProvider provider) ToChar Method char IConvertible.ToChar(System.IFormatProvider provider) ToCharArray Method char[] ToCharArray(), char[] ToCharArray(int startIndex, int length) ToDateTime Method datetime IConvertible.ToDateTime(System.IFormatProvider provider) ToDecimal Method decimal IConvertible.ToDecimal(System.IFormatProvider provider) ToDouble Method double IConvertible.ToDouble(System.IFormatProvider provider) ToInt16 Method int16 IConvertible.ToInt16(System.IFormatProvider provider) ToInt32 Method int IConvertible.ToInt32(System.IFormatProvider provider) ToInt64 Method long IConvertible.ToInt64(System.IFormatProvider provider) ToLower Method string ToLower(), string ToLower(cultureinfo culture) ToLowerInvariant Method string ToLowerInvariant() ToSByte Method sbyte IConvertible.ToSByte(System.IFormatProvider provider) ToSingle Method float IConvertible.ToSingle(System.IFormatProvider provider) ToString Method string ToString(), string ToString(System.IFormatProvider provider), string IConvertible.ToString(System.IFormatProvider provider) ToType Method System.Object IConvertible.ToType(type conversionType, System.IFormatProvider provider) ToUInt16 Method uint16 IConvertible.ToUInt16(System.IFormatProvider provider) ToUInt32 Method uint32 IConvertible.ToUInt32(System.IFormatProvider provider) ToUInt64 Method uint64 IConvertible.ToUInt64(System.IFormatProvider provider) ToUpper Method string ToUpper(), string ToUpper(cultureinfo culture) ToUpperInvariant Method string ToUpperInvariant() Trim Method string Trim(Params char[] trimChars), string Trim() TrimEnd Method string TrimEnd(Params char[] trimChars) TrimStart Method string TrimStart(Params char[] trimChars) Chars ParameterizedProperty char Chars(int index) {get;} Length Property int Length {get;} |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
PS C:\Users\RobotChicken> Get-Service | Get-Member TypeName: System.ServiceProcess.ServiceController Name MemberType Definition ---- ---------- ---------- Name AliasProperty Name = ServiceName RequiredServices AliasProperty RequiredServices = ServicesDependedOn Disposed Event System.EventHandler Disposed(System.Object, System.EventArgs) Close Method void Close() Continue Method void Continue() CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(type requestedType) Dispose Method void Dispose(), void IDisposable.Dispose() Equals Method bool Equals(System.Object obj) ExecuteCommand Method void ExecuteCommand(int command) GetHashCode Method int GetHashCode() GetLifetimeService Method System.Object GetLifetimeService() GetType Method type GetType() InitializeLifetimeService Method System.Object InitializeLifetimeService() Pause Method void Pause() Refresh Method void Refresh() Start Method void Start(), void Start(string[] args) Stop Method void Stop() WaitForStatus Method void WaitForStatus(System.ServiceProcess.ServiceControllerStatus desiredStatus), void WaitForStatus(System.ServiceProcess.ServiceControll... CanPauseAndContinue Property bool CanPauseAndContinue {get;} CanShutdown Property bool CanShutdown {get;} CanStop Property bool CanStop {get;} Container Property System.ComponentModel.IContainer Container {get;} DependentServices Property System.ServiceProcess.ServiceController[] DependentServices {get;} DisplayName Property string DisplayName {get;set;} MachineName Property string MachineName {get;set;} ServiceHandle Property System.Runtime.InteropServices.SafeHandle ServiceHandle {get;} ServiceName Property string ServiceName {get;set;} ServicesDependedOn Property System.ServiceProcess.ServiceController[] ServicesDependedOn {get;} ServiceType Property System.ServiceProcess.ServiceType ServiceType {get;} Site Property System.ComponentModel.ISite Site {get;set;} StartType Property System.ServiceProcess.ServiceStartMode StartType {get;} Status Property System.ServiceProcess.ServiceControllerStatus Status {get;} ToString ScriptMethod System.Object ToString(); |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Consultar apenas as Propriedades do cmdlet Get-Service PS C:\Users\RobotChicken> Get-Service | Get-Member -MemberType Property TypeName: System.ServiceProcess.ServiceController Name MemberType Definition ---- ---------- ---------- CanPauseAndContinue Property bool CanPauseAndContinue {get;} CanShutdown Property bool CanShutdown {get;} CanStop Property bool CanStop {get;} Container Property System.ComponentModel.IContainer Container {get;} DependentServices Property System.ServiceProcess.ServiceController[] DependentServices {get;} DisplayName Property string DisplayName {get;set;} MachineName Property string MachineName {get;set;} ServiceHandle Property System.Runtime.InteropServices.SafeHandle ServiceHandle {get;} ServiceName Property string ServiceName {get;set;} ServicesDependedOn Property System.ServiceProcess.ServiceController[] ServicesDependedOn {get;} ServiceType Property System.ServiceProcess.ServiceType ServiceType {get;} Site Property System.ComponentModel.ISite Site {get;set;} StartType Property System.ServiceProcess.ServiceStartMode StartType {get;} Status Property System.ServiceProcess.ServiceControllerStatus Status {get;} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# Consultar apenas as Propriedades e Aliases dos membros do cmdlet Get-Service PS C:\Users\RobotChicken> Get-Service | Get-Member -MemberType Property, AliasProperty TypeName: System.ServiceProcess.ServiceController Name MemberType Definition ---- ---------- ---------- Name AliasProperty Name = ServiceName RequiredServices AliasProperty RequiredServices = ServicesDependedOn CanPauseAndContinue Property bool CanPauseAndContinue {get;} CanShutdown Property bool CanShutdown {get;} CanStop Property bool CanStop {get;} Container Property System.ComponentModel.IContainer Container {get;} DependentServices Property System.ServiceProcess.ServiceController[] DependentServices {get;} DisplayName Property string DisplayName {get;set;} MachineName Property string MachineName {get;set;} ServiceHandle Property System.Runtime.InteropServices.SafeHandle ServiceHandle {get;} ServiceName Property string ServiceName {get;set;} ServicesDependedOn Property System.ServiceProcess.ServiceController[] ServicesDependedOn {get;} ServiceType Property System.ServiceProcess.ServiceType ServiceType {get;} Site Property System.ComponentModel.ISite Site {get;set;} StartType Property System.ServiceProcess.ServiceStartMode StartType {get;} Status Property System.ServiceProcess.ServiceControllerStatus Status {get;} |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
PS C:\Users\RobotChicken> Get-Service W32Time | Format-List -Property * Name : W32Time RequiredServices : {} CanPauseAndContinue : False CanShutdown : True CanStop : True DisplayName : Horário do Windows DependentServices : {} MachineName : . ServiceName : W32Time ServicesDependedOn : {} ServiceHandle : SafeServiceHandle Status : Running ServiceType : Win32OwnProcess, Win32ShareProcess StartType : Manual Site : Container : |
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:
1 2 3 |
PS C:\Users\RobotChicken> Get-Service W32Time | Format-List -Property DisplayName DisplayName : Horário do Windows |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
PS C:\Users\RobotChicken> Set-Service -Name W32Time -DisplayName "Novo Horario do Windows" PS C:\Users\RobotChicken> Get-Service W32Time Status Name DisplayName ------ ---- ----------- Running W32Time Novo Horario do Windows PS C:\Users\RobotChicken> Set-Service -Name W32Time -DisplayName 500 PS C:\Users\RobotChicken> Get-Service W32Time Status Name DisplayName ------ ---- ----------- Running W32Time 500 |
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:
1 2 3 4 5 6 7 8 |
PS C:\Users\RobotChicken> Set-Service W32Time -Status 0 Set-Service : Não é possível validar o argumento no parâmetro 'Status'. O argumento "0" não pertence ao conjunto "Running;Stopped;Paused" especificado pelo atributo ValidateSet. Forneça um argumento que esteja no conjunto e tente o comando novamente. No linha:1 caractere:29 + Set-Service W32Time -Status 0 + ~ + CategoryInfo : InvalidData: (:) [Set-Service], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SetServiceCommand |
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!