Muitas vezes, ao escrever scripts do PowerShell, você precisa de uma maneira de armazenar um conjunto de itens. Uma maneira comum de fazer isso é com uma matriz ou um tipo específico conhecido como ArrayList. Mas afinal, o que é uma matriz? Uma matriz é uma estrutura de dados projetada para armazenar uma coleção de itens. Isso pode incluir itens do mesmo ou de diferentes tipos.
As matrizes são usadas em muitas linguagens de programação diferentes, e o PowerShell não é exceção. Existem muitas maneiras de criar, manipular e otimizar matrizes. Neste artigo, você aprenderá sobre ArrayLists, Arrays e Collections, bem como algumas boas práticas ao aplicá-los com o PowerShell.
Pré-requisitos/Requisitos
Como você estará trabalhando apenas com a linguagem PowerShell em si, não há pré-requisitos ambientais. Você só precisa ter um PC com Windows com o PowerShell. Mais especificamente:
- Windows PowerShell 3 ou posterior
- .NET Framework 4.5 ou posterior
Quer mais dicas como esta? Confira meu blog pessoal do PowerShell em: https://nkasco.com/FriendsOfATA
Criando Matrizes com o PowerShell
Há muitas maneiras diferentes de criar matrizes com o PowerShell. Vamos supor que você tenha uma lista de nomes que precisa processar de alguma forma, conforme mostrado abaixo.
Construindo Matrizes por Meio de Elementos Separados por Vírgulas
A maneira mais básica de criar uma matriz é simplesmente atribuir entradas conhecidas, separadas por vírgulas, a uma variável, conforme mostrado abaixo.
Se você executar o método GetType()
disponível em todos os objetos no PowerShell, verá que criou com sucesso uma matriz, conforme indicado pela propriedade BaseType
mostrada abaixo.
Usando o Operador de Subexpressão
Você também pode criar matrizes no PowerShell por meio de um operador de subexpressão. Esse conceito é comumente usado quando você não sabe quantos itens serão adicionados à sua matriz. O resultado pode conter zero ou muitos itens quando criado.
Observe abaixo que uma matriz chamada $MyArray
foi criada sem nenhum elemento dentro.
Usando o Operador de Intervalo
As matrizes não se limitam apenas ao armazenamento de strings, como mostrado acima. Você também pode criar matrizes com outros tipos de objetos, como inteiros.
Se você precisa de uma matriz de inteiros em ordem sequencial, pode usar o atalho e o operador de intervalo ..
. Abaixo, você pode ver que uma matriz foi criada com os inteiros de 2 a 5 com uma única linha de código.
Criando Coleções ArrayList no PowerShell
O uso de um ArrayList do PowerShell é outra maneira de armazenar uma lista de itens no PowerShell. A classe ArrayList faz parte do namespace System.Collections dentro do .NET. Ao criar um novo objeto desse tipo, você pode armazenar objetos dentro de um ArrayList.
Abaixo, você pode ver que é necessário criar explicitamente um objeto ArrayList usando o cmdlet New-Object
ou convertendo uma matriz padrão em um objeto ArrayList.
Observe que, neste caso, o BaseType
é um objeto, enquanto os exemplos acima têm BaseTypes de Arrays, que exibem herança da classe Object. No final das contas, o PowerShell está fornecendo acesso ao sistema de tipos .NET.
Adicionando Itens a um Array
Ao criar um array, você pode definir todos os elementos no momento da criação ou adicioná-los ad-hoc.
Para adicionar elementos a uma coleção existente, você pode usar o operador +=
ou o método Add
. Mas saiba que há diferenças significativas em como eles operam.
Ao criar um array padrão com @()
, você usará o operador +=
, mas para adicionar elementos a um ArrayList, você usaria o método Add
. Esses métodos diferem no sentido de que o operador +=
realmente destroi o array existente e cria um novo com o novo item.
Para demonstrar, você verá abaixo que pode fazer referência à propriedade IsFixedSize
para um array ou ArrayList para saber qual é imutável e qual não é.
Já que um array básico é uma coleção de tamanho fixo, você não pode modificá-lo.
Tentativa de usar o método Add()
com uma matriz de tamanho fixo resultará em um erro devido ao tamanho fixo. Abaixo, você pode ver alguns exemplos nos quais é possível adicionar itens a uma matriz com sucesso.
Removendo Itens de uma Matriz
Agora que você tem uma melhor compreensão de como adicionar itens a uma matriz, vamos cobrir algumas maneiras de remover itens de uma matriz.
Dado que uma matriz básica é fixa, você não pode remover itens dela. Em vez disso, é necessário criar uma nova matriz. Por exemplo, você pode remover um único elemento de uma matriz criando uma declaração condicional que corresponda apenas aos elementos que deseja incluir. Um exemplo é mostrado abaixo.
Dado que um ArrayList não é fixo, você pode remover elementos deles usando o método Remove()
. Este é um cenário no qual usar um ArrayList pode ser benéfico se você planeja adicionar/remover itens com frequência.
Recuperando Itens Específicos de uma Matriz ou ArrayList
Para recuperar itens específicos de uma matriz ou ArrayList, você pode usar muitos métodos diferentes. Assim como outros objetos no PowerShell, você pode acessar todos os elementos de uma matriz simplesmente chamando o objeto.
Talvez você precise apenas recuperar o primeiro elemento, as matrizes sempre terão uma origem de 0 representando o primeiro elemento da matriz. Para recuperar o primeiro elemento de uma matriz, especifique o número do índice entre colchetes, como mostrado abaixo.
Conversamente, também é possível fazer referência aos índices de forma inversa usando um traço (indicador negativo) para chamar os últimos X elementos do array. Uma maneira comum de encontrar o último elemento em um array é usando -1
, como mostrado abaixo.
O operador de intervalo que você aprendeu anteriormente também pode ser usado para recuperar objetos de um array seguindo o mesmo método de chamada dos elementos. Digamos que você queira recuperar os quatro primeiros nomes no array $BasicArray
.
Como você pode ver abaixo, é possível especificar um intervalo de índices de 0 a 3, o que retornará os quatro primeiros elementos.
Otimizando Arrays com PowerShell
Agora que você tem uma boa base de como criar e manipular arrays, qual deles você deve usar? Para responder a isso, vamos passar por alguns exemplos com o cmdlet Measure-Command
. Usando o cmdlet Measure-Command
, você entenderá melhor quanto tempo os comandos estão levando para processar os elementos à medida que são passados pelo pipeline.
Em termos gerais, se você tiver uma pequena coleção de objetos, provavelmente não perceberá muita diferença na manipulação de seus arrays. No entanto, se você tiver uma grande coleção de objetos, é importante entender as diferenças para obter resultados ótimos.
Vamos aplicar o que você acabou de aprender na seção anterior sobre a diferença entre +=
e o uso do método Add()
com um loop de 50.000 itens.
Primeiro, crie uma matriz vazia e um ArrayList vazio conforme mostrado abaixo.
Em seguida, popule 50.000 elementos em cada coleção usando o operador de intervalo e um loop foreach como mostrado abaixo.
Por fim, envolva seus comandos em uma expressão e passe essa expressão para o cmdlet Measure-Command
. Ao executar a expressão com Measure-Command
, você pode ver quanto tempo cada processo realmente leva para ser executado.
Tenha em mente que, como você aprendeu antes,
+=
na verdade cria uma nova matriz em vez de anexar a uma fixa.
O resultado? Quase 60 segundos versus 139 milissegundos!
Como você pode ver, é muito mais rápido aproveitar um ArrayList para coleções grandes em vez de usar uma matriz de tamanho fixo.
Embora este seja um exemplo básico, destaca a importância de entender o que seu código está fazendo durante o processamento. Se não for devidamente entendido, pode resultar em uma experiência de usuário ruim.
Se você tiver algum script existente que possa se beneficiar do uso de um ArrayList em vez de uma matriz, esta seria uma oportunidade fantástica para fazer uma melhoria noturna!
Leitura adicional
Quer mais dicas como esta? Confira o meu blog pessoal de PowerShell em: https://nkasco.com/FriendsOfATA.