muitas vezes, ao escrever scripts PowerShell, você precisa de uma forma de armazenar um conjunto de itens. Uma maneira comum de conseguir isso é com um array ou tipo específico conhecido como um ArrayList. Mas o que é uma matriz? Um array é uma estrutura de dados que é projetado para armazenar uma coleção de itens. Isto pode incluir tanto os mesmos e diferentes tipos de itens.
Arrays são usados em muitas linguagens de programação diferentes e PowerShell não é diferente. Existem muitas maneiras de criar, manipular e otimizar arrays., Neste artigo você vai aprender sobre ArrayLists, Arrays e coleções, bem como algumas boas práticas ao aplicá-los com PowerShell.
tabela de conteúdo
pré-requisitos/Requisitos
Uma vez que você só estará trabalhando com a linguagem PowerShell em si, não existem pré-requisitos ambientais. Você só precisa ter um Windows PC com PowerShell. Mais especificamente:
- Windows PowerShell 3 ou mais tarde
- .NET Framework 4.5 ou posterior
Quer mais dicas como esta?, Confira meu blog pessoal PowerShell em: https://nkasco.com/FriendsOfATA
criando Arrays com PowerShell
Existem muitas maneiras diferentes de criar arrays com PowerShell. Vamos assumir que você tem uma lista de nomes que você precisa processar de alguma forma como mostrado abaixo.
JohnSusieJimJohnnyCarrie
construir Arrays através de elementos separados por vírgulas
a forma mais básica de criar um array é simplesmente atribuir entradas conhecidas, separadas por vírgulas, a uma variável como mostrado abaixo.,
$BasicArray = "John", "Susie", "Jim", "Johnny", "Carrie"
Se executar o métodoGetType()
disponível em todos os objectos em PowerShell, irá ver que criou com sucesso um array tal como indicado pelo ID
propriedade mostrada abaixo.
PS51> $BasicArray.GetType()IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object System.Array
usando o operador de sub-expressão
Você também pode criar arrays em PowerShell através de um operador de sub-expressão. Este conceito é comumente usado quando você não sabe quantos itens serão adicionados ao seu array. O resultado pode conter zero, ou muitos itens quando criados.,
Notice below an array called $MyArray
has been created with zero elements inside.
#Create an empty array with the sub-expression operatorPS51> $MyArray = @()PS51> $MyArray.count0
usando o operador de intervalo
As matrizes não são apenas relegadas para o armazenamento de strings como mostrado acima. Você também pode criar arrays com outros tipos de objetos como inteiros.
Se necessitar de um conjunto de inteiros em ordem sequencial, pode tomar um atalho e usar o intervalo ..
operador. Abaixo você pode ver um array foi criado com os inteiros 2 a 5 com uma única linha de código.,
PS51> $NumberedArray = 2..5PS51> $NumberedArray2345
a criação de colecções de Listas PowerShell
Usando uma lista de Listas PowerShell também é uma forma de armazenar uma lista de itens com PowerShell. A classe ArrayList é parte do sistema.O espaço de nomes das colecções no .NET. ao criar um novo objecto deste tipo, poderá então guardar os objectos dentro de uma lista.
abaixo você pode ver que você precisa criar explicitamente um objeto listado usando o New-Object
cmdlet ou lançando um array padrão para um objeto listado.,
Notice that in this case the BaseType
is an object whereas the above examples have BaseTypes of Arrays which exhibit inheritance from the Object class. Em última análise, PowerShell está fornecendo acesso ao sistema do tipo .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 colecção existente, pode utilizar o método +=
operador ou o método Add
. Mas saibam que existem grandes diferenças na forma como operam.,
Quando você cria um padrão de matriz com @()
, você vai usar o +=
operador, mas para adicionar elementos a uma ArrayList, você pode usar o Add
método. Estes métodos diferem em que o operador +=
destrói realmente o array existente e cria um novo com o novo item.
para demonstrar, você verá abaixo que você pode referenciar o id
propriedade para um array ou ArrayList para saber o que é imutável e o que não é.,
PS51> $BasicArray.IsFixedSizeTruePS51> $MyArrayList.IsFixedSizeFalse
Uma vez que uma matriz básica é uma coleção de tamanho fixo, você não pode modificá-la.
tentar usar o método Add()
com um array que é tamanho fixo resultará em um erro devido ao tamanho fixo. Abaixo você pode ver alguns exemplos em que você pode adicionar com sucesso itens a uma matriz.
#Does NOT work$BasicArray.Add("Nate")#Works$BasicArray += "Nate"$MyArrayList.Add("Nate")$MyArrayList += "Nate"
Remover Itens De Um Array
Agora que você tem uma melhor compreensão de como adicionar itens a uma matriz, vamos cobrir algumas maneiras que você pode remover itens de uma matriz.,
Uma vez que uma matriz básica é fixa, você não pode remover itens deles. Em vez disso, você tem que criar uma matriz inteiramente nova. Por exemplo, você pode remover um único elemento de um array criando uma declaração condicional que só corresponde aos elementos que você gostaria de incluir. Um exemplo é mostrado abaixo.
$NewBasicArray = $BasicArray -ne "Nate"
Uma vez que um ArrayList não é fixo, você pode remover elementos deles usando o métodoRemove()
. Este é um cenário em que o uso de um ArrayList pode beneficiar você se você planeja ser frequentemente Adicionar/Remover itens.,
$MyArrayList.Remove("Nate")
recuperando itens específicos de um Array ou ArrayList
para recuperar itens específicos de um array ou ArrayList você pode usar muitos métodos diferentes. Assim como outros objetos em PowerShell, você pode acessar todos os elementos de um array simplesmente chamando o objeto.
PS51> $BasicArrayJohnSusieJimJohnnyCarrie
talvez você precise apenas recuperar o primeiro elemento, arrays sempre terão uma origem de 0 representando o primeiro elemento da matriz. Para obter o primeiro elemento de um array, especifique o número de índice entre parênteses como mostrado abaixo.,
inversamente, Você também pode referenciar índices para trás usando um traço (indicador negativo) para chamar o último número X de elementos da matriz. Uma maneira comum de encontrar o último elemento em um array é usando -1
como mostrado abaixo.
PS51> $BasicArrayCarrie
o operador de gama que você aprendeu acima também pode ser usado para recuperar objetos de uma matriz seguindo o mesmo método de chamar os elementos. Digamos que você quer recuperar os primeiros quatro nomes no$BasicArray
array.,
Você pode ver abaixo você pode especificar uma gama de índices 0-3 que irá retornar os primeiros quatro elementos.
PS51> $BasicArrayJohnSusieJimJohnny
Optimizing Arrays with PowerShell
Now that you have a good foundation of how to create and manipulate arrays, which one should you use? Para responder a isso, vamos percorrer alguns exemplos com o Measure-Command
cmdlet. Usando o Measure-Command
cmdlet, você vai entender melhor quanto tempo os comandos estão levando para processar elementos à medida que eles são passados para o gasoduto.,de um modo geral, se tiver uma pequena colecção de objectos, provavelmente não irá notar muita diferença com a forma como manipula as suas matrizes. No entanto, se você tem uma grande coleção de objetos, é importante entender as diferenças para alcançar os melhores resultados.
Let’s apply what you just learned in the prior section about the difference between +=
and using theAdd()
method with a loop of 50.000 items.
primeiro, crie um array vazio e uma lista vazia como mostrado abaixo.,
PS51> $MyArray = @()PS51> $MyArrayList = @()
seguinte, poular 50.000 elementos em cada coleção usando o operador de gama e um laço foreach como mostrado abaixo.
@(0..50000).foreach({$MyArray += $_})@(0..50000).foreach({$MyArrayList.Add($_)})
finalmente, embrulhe os seus comandos numa expressão e passe essa expressão para oMeasure-Command
cmdlet. Ao executar a expressão com Measure-Command
, você pode ver quanto tempo cada processo realmente leva para executar.
Mantenha em mente que, como você aprendeu antes,
+=
na verdade, cria uma nova matriz, em vez de acrescentar fixa.,
o resultado? Quase 60 segundos contra 139 milissegundos!
Como você pode ver, é muito mais rápido para alavancar um ArrayList para grandes coleções ao invés de usar um array de tamanho fixo.
embora este seja um exemplo básico, ele enfatiza a importância de entender o que seu código está fazendo durante o processamento. Se não for devidamente compreendido, pode resultar em uma má experiência de usuário.,
Se você tem algum script existente que poderia se beneficiar de usar um ArrayList em vez de um array, isso representaria uma oportunidade fantástica para fazer uma melhoria da noite para o dia!
Ler Mais
- a Comparação de matrizes com PowerShell
- Como Criar Matrizes para o Desempenho no PowerShell (MCPmag)
Quer mais dicas como esta? Confira meu blog pessoal PowerShell em: https://nkasco.com/FriendsOfATA.