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"

.

Deixe uma resposta

O seu endereço de email não será publicado.