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.