about_Object_Creation
Breve descrição
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 de chave.
- Add-Type: Permite definir uma classe em sua sessão do PowerShell que você pode instanciar com
New-Object
o . - 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()
- Digitando tabelas de hash de nomes de propriedade e valores de propriedade
Método estático new()
Todos os tipos .NET têm um new()
método que permite construir instâncias mais facilmente. 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 atualmente carregados 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 pelos cmdlets do PowerShell. Os cmdlets, provedores e Sistema de Tipo Estendido do PowerShell podem adicionar propriedades extras à instância.
Por exemplo, o provedor FileSystem no PowerShell adiciona seis valores NoteProperty ao objeto DirectoryInfo retornado pelo 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 Extended Type System, consulte about_Types.ps1xml.
Esse recurso foi adicionado no PowerShell 5.0
Criar objetos a partir de tabelas hash
Pode criar um objeto a partir de uma tabela hash de propriedades e valores de propriedade.
A sintaxe é 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 hash
Os objetos personalizados são muito úteis e são fáceis de criar através do método da tabela hash. A classe PSCustomObject foi projetada especificamente para essa finalidade.
Os 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 a saída formatada que não pode ser reformatada ou canalizada para outros comandos.
Os comandos no Test-Object function
definir alguns valores de variável e, em seguida, usar 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 desta 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 os 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. Embora os objetos Hashtable não garantam a ordem dos pares chave-valor, a conversão de uma hashtable literal para [pscustomobject]
manter a ordem.
A hashtable deve ser literal. Se você envolver a hashtable entre parênteses ou se lançar uma variável contendo uma hashtable, 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 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 do sistema .
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 da funcionalidade de tabela hash, sobretudo o requisito do construtor sem parâmetros, eliminam muitas classes existentes. No entanto, a maioria das classes de opção do PowerShell são projetadas para trabalhar 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
...
Também pode utilizar a funcionalidade de tabela hash ao definir os valores de parâmetros. Por exemplo, o valor do parâmetro SessionOption do New-PSSession
.
cmdlet pode ser uma tabela 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 têm espaços reservados (parâmetros de tipo) para um ou mais dos tipos que 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 no .NET.