Quando escrevo scripts PowerShell, eu frequentemente procuro por dados específicos, armazeno esses dados em um objeto e na maioria das vezes os exporto para o formato CSV. Este artigo mostra-lhe como fazer tudo isto usando PSObject
.
A maneira mais fácil que encontro para armazenar dados para um objecto é armazená-los usando um PSObject
. Se você tem vários objetos que você precisa armazenar dados para então você pode então armazenar cada PSObject
em um array. Este array pode então ser exportado para CSV.
A PSObject
é muito parecido com um hashtable onde os dados são armazenados em pares de valores chave. Você pode criar quantos pares de valores chave quiser para cada PSObject
.
Criando um PSObject
Como mencionado, o PowerShell PSObject
usa uma chave & tipo de estrutura de par de valores. Para armazenar dados no PSObject
basta definir uma chave e depois armazenar um valor na chave. Os exemplos abaixo criam um novo PSObject
e armazena alguns dados no objeto. Neste exemplo estamos a criar duas “chaves” (Chave1 e Chave2). Cada uma delas contém bits de dados sobre o objeto (Valor1 e Valor2).
Em um cenário da vida real as chaves e os valores contêm informações do tipo de descrição sobre o objeto. Assim, por exemplo, se estivéssemos a armazenar informação sobre um ficheiro, alguns dos pares de valores chave que poderíamos criar seriam Name, FileExtension, Path e Size.
Aqui está a forma de criar um PSObject
em ambos os PowerShell 2.0 e 3.0 e superior:
PowerShell 2.0
$MyPSObject = New-Object -TypeName psobject -Property @{ Key1 = 'Value1' Key2 = 'Value2'}
PowerShell 3.0 & superior
No PowerShell 3.0 e superior, recomenda-se que utilize o seguinte código para criar um PSObject
. Isto porque ele mantém a ordem de cada valor chave criado, o que significa que ao exportar para CSV a ordem de ordenação é mantida.
$MyPSObject = @{ Key1 = 'Value1' Key2 = 'Value2'}
Armazenar múltiplos PSObjects num array
Até agora temos olhado para armazenar informações sobre um único objecto (por exemplo, um ficheiro). E se estivermos enumerando uma pasta e precisarmos armazenar informações sobre todos os arquivos da pasta? Nesse caso, nós criaríamos um PSObject
para cada arquivo (para armazenar seus dados individuais) e então armazenaríamos todos esses PSObjects em um array. Isto torna realmente fácil armazenar e exportar informações para múltiplos objetos.
Aqui está como armazenar um PSObject dentro de um array. Para fazer isso para múltiplos arquivos você faria isso dentro do laço ForEach
loop:
# Initialising the array$MyArray = @()# Storing PSObject in an array$MyArray += $MyPSObject
An Real World Example
Vamos configurar um exemplo rápido para ajudar com a demonstração. Neste exemplo vamos fazer o seguinte:
Ler um ficheiro de texto que tem uma lista de nomes de empregados. Para cada nome vamos procurá-los no AD e reunir algumas informações adicionais, incluindo nome de usuário e endereço de e-mail. Em seguida, enviaremos esses dados para CSV.
Example Solution
O script abaixo enumera todos os nomes dos funcionários no arquivo de texto, e para cada um deles procura no AD as informações adicionais dos funcionários. Cada um destes dados é armazenado no seu próprio PSObject chamado $hItemDetails
.
Para garantir que os dados estão na ordem correcta quando são exportados para o CSV, usamos o método @{}
para criar um novo PSObject
(apenas disponível no PowerShell 3.0 e superior). Finalmente, como existem vários funcionários, eu armazeno cada PSObject num array chamado $aResults
. Este array é então exportado para CSV.
Import-Module ActiveDirectory$aResults = @()$List = Get-Content "C:\Temp\List.txt" ForEach ($Item in $List) { $Item = $Item.Trim() $User = Get-ADUser -Filter { displayName -like $Item -and SamAccountName -notlike "a-*" -and Enabled -eq $True } -Properties SamAccountName, GivenName, Surname, telephoneNumber $sEmail = $User.GivenName + "." + $User.Surname + "@test.com" $hItemDetails = @ { FullName = $Item UserName = $User.SamAccountName Email = $sEmail Tel = $User.telephoneNumber } #Add data to array $aResults += $hItemDetails}$aResults | Export-CSV "C:\Temp\Results.csv"
.