Compartilhar via


about_Object_Creation

Descrição breve

Explica como criar objetos no PowerShell.

Descrição longa

Você pode criar objetos no PowerShell e usar os objetos criados em comandos e scripts.

Existem muitas maneiras de criar objetos, esta lista não é definitiva:

  • New-Object: cria uma instância de um objeto .NET Framework ou objeto COM.
  • Import-Csv/ConvertFrom-CSV: cria objetos personalizados (PSCustomObject) a partir dos itens definidos como valores separados por caracteres.
  • ConvertFrom-Json: cria objetos personalizados definidos em JavaScript Object Notation (JSON).
  • ConvertFrom-StringData: cria objetos personalizados definidos como pares de valores-chave.
  • Add-Type: permite definir uma classe em sua sessão do PowerShell que você pode instanciar com New-Object.
  • New-Module: o parâmetro AsCustomObject cria um objeto personalizado que você define usando o bloco de script.
  • Add-Member: adiciona propriedades a objetos existentes. Você pode usar Add-Member para criar um objeto personalizado a partir de um tipo simples, como [System.Int32].
  • Select-Object: Seleciona propriedades em um objeto. Você pode usar Select-Object para criar propriedades personalizadas e calculadas em um objeto já instanciado.

Os seguintes métodos adicionais são abordados neste artigo:

  • Chamando o construtor de um tipo usando um método estático new()
  • Por typecasting tabelas de hash de nomes de propriedade e valores de propriedade

Método new() estático

Todos os tipos .NET têm um new() método que permite construir instâncias com mais facilidade. Você também pode ver todos os construtores disponíveis para um determinado tipo.

Para ver os construtores de um tipo, especifique o nome do new método após o nome do tipo e pressione <ENTER>.

[System.Uri]::new
OverloadDefinitions
-------------------
uri new(string uriString)
uri new(string uriString, bool dontEscape)
uri new(uri baseUri, string relativeUri, bool dontEscape)
uri new(string uriString, System.UriKind uriKind)
uri new(uri baseUri, string relativeUri)
uri new(uri baseUri, uri relativeUri)

Agora, você pode criar um System.Uri especificando o construtor apropriado.

[System.Uri]::new("https://www.bing.com")
AbsolutePath   : /
AbsoluteUri    : https://www.bing.com/
LocalPath      : /
Authority      : www.bing.com
...

Você pode usar o exemplo a seguir para determinar quais tipos .NET estão carregados no momento para você instanciar.

[AppDomain]::CurrentDomain.GetAssemblies() |
  ForEach-Object {
    $_.GetExportedTypes() |
      ForEach-Object { $_.FullName }
  }

Os objetos criados usando o new() método podem não ter as mesmas propriedades que os objetos do mesmo tipo criados por cmdlets do PowerShell. Cmdlets, provedores e Sistema de Tipos Estendidos do PowerShell podem adicionar propriedades extras à instância.

Por exemplo, o provedor FileSystem no PowerShell adiciona seis valores NoteProperty ao objeto DirectoryInfo retornado por Get-Item.

$PSDirInfo = Get-Item /
$PSDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    6 NoteProperty
    1 ScriptProperty
   18 Method

Quando você cria um objeto DirectoryInfo diretamente, ele não tem esses seis valores NoteProperty.

$NewDirInfo = [System.IO.DirectoryInfo]::new('/')
$NewDirInfo | Get-Member | Group-Object MemberType | Select-Object Count, Name
Count Name
----- ----
    4 CodeProperty
   13 Property
    1 ScriptProperty
   18 Method

Para obter mais informações sobre o Sistema de Tipos Estendidos, consulte about_Types.ps1xml.

Esse recurso foi adicionado no PowerShell 5.0

Criar objetos a partir de tabelas de hash

Você pode criar um objeto a partir de uma tabela de hash de propriedades e valores de propriedade.

A sintaxe dela é a seguinte:

[<class-name>]@{
  <property-name>=<property-value>
  <property-name>=<property-value>
}

Esse método funciona apenas para classes que têm um construtor sem parâmetros. As propriedades do objeto devem ser públicas e configuráveis.

Esse recurso foi adicionado no PowerShell versão 3.0

Criar objetos personalizados a partir de tabelas de hash

Objetos personalizados são muito úteis e fáceis de criar usando o método de tabela de hash. A classe PSCustomObject foi projetada especificamente para essa finalidade.

Objetos personalizados são uma excelente maneira de retornar a saída personalizada de uma função ou script. Isso é mais útil do que retornar uma saída formatada que não pode ser reformatada ou canalizada para outros comandos.

Os comandos no Test-Object function definem alguns valores de variáveis e, em seguida, usam esses valores para criar um objeto personalizado. Você pode ver esse objeto em uso na seção de exemplo do tópico de ajuda do Update-Help cmdlet.

function Test-Object {
  $ModuleName = "PSScheduledJob"
  $HelpCulture = "en-us"
  $HelpVersion = "3.1.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
  $ModuleName = "PSWorkflow"
  $HelpCulture = "en-us"
  $HelpVersion = "3.0.0.0"
  [PSCustomObject]@{
    "ModuleName"=$ModuleName
    "UICulture"=$HelpCulture
    "Version"=$HelpVersion
  }
}
Test-Object

A saída dessa função é uma coleção de objetos personalizados formatados como uma tabela por padrão.

ModuleName        UICulture      Version
---------         ---------      -------
PSScheduledJob    en-us          3.1.0.0
PSWorkflow        en-us          3.0.0.0

Os usuários podem gerenciar as propriedades dos objetos personalizados da mesma forma que fazem com objetos padrão.

(Test-Object).ModuleName
 PSScheduledJob
 PSWorkflow

Os objetos do tipo PSObject mantêm a lista de membros na ordem em que os membros foram adicionados ao objeto. Mesmo que os objetos Hashtable não garantam a ordem dos pares chave-valor, a conversão de uma tabela de hash literal para [pscustomobject] manter a ordem.

A tabela de hash deve ser um literal. Se você envolver a tabela de hash entre parênteses ou se converter uma variável contendo uma tabela de hash, não há garantia de que a ordem seja preservada.

$hash = @{
    Name      = "Server30"
    System    = "Server Core"
    PSVersion = "4.0"
}
$Asset = [pscustomobject]$hash
$Asset
System      Name     PSVersion
------      ----     ---------
Server Core Server30 4.0

Criar objetos não personalizados a partir de tabelas de hash

Você também pode usar tabelas de hash para criar objetos para classes não personalizadas. Quando você cria um objeto para uma classe não personalizada, o nome do tipo qualificado para namespace é necessário, embora você possa omitir qualquer componente inicial do namespace System .

Por exemplo, o comando a seguir cria um objeto de opção de sessão.

[System.Management.Automation.Remoting.PSSessionOption]@{
  IdleTimeout=43200000
  SkipCnCheck=$True
}

Os requisitos do recurso de tabela de hash, especialmente o requisito de construtor sem parâmetros, eliminam muitas classes existentes. No entanto, a maioria das classes de opção do PowerShell foi projetada para funcionar com esse recurso, bem como outras classes muito úteis, como a classe ProcessStartInfo.

[System.Diagnostics.ProcessStartInfo]@{
  CreateNoWindow="$true"
  Verb="run as"
}
Arguments               :
ArgumentList            : {}
CreateNoWindow          : True
EnvironmentVariables    : {OneDriveConsumer, PROCESSOR_ARCHITECTURE,
                           CommonProgramFiles(x86), APPDATA...}
Environment             : {[OneDriveConsumer, C:\Users\user1\OneDrive],
                           [PROCESSOR_ARCHITECTURE, AMD64],
                           [CommonProgramFiles(x86),
                           C:\Program Files (x86)\Common Files],
                           [APPDATA, C:\Users\user1\AppData\Roaming]...}
RedirectStandardInput   : False
RedirectStandardOutput  : False
RedirectStandardError   : False
...

Você também pode usar o recurso de tabela de hash ao definir valores de parâmetro. Por exemplo, o valor do parâmetro SessionOption do New-PSSession. cmdlet pode ser uma tabela de hash.

New-PSSession -ComputerName Server01 -SessionOption @{
  IdleTimeout=43200000
  SkipCnCheck=$True
}
Register-ScheduledJob Name Test -FilePath .\Get-Inventory.ps1 -Trigger @{
  Frequency="Daily"
  At="15:00"
}

Objetos genéricos

Você também pode criar objetos genéricos no PowerShell. Genéricos são classes, estruturas, interfaces e métodos que possuem espaços reservados (parâmetros de tipo) para um ou mais dos tipos que eles armazenam ou usam.

O exemplo a seguir cria um objeto Dictionary .

$dict = New-Object 'System.Collections.Generic.Dictionary[String,Int]'
$dict.Add("One", 1)
$dict
Key Value
--- -----
One     1

Para obter mais informações sobre Genéricos, consulte Genéricos em .NET.

Confira também