Share via


about_Arrays

Descrição breve

Descreve matrizes, que são estruturas de dados projetadas para armazenar coleções de itens.

Descrição longa

Uma matriz é uma estrutura de dados projetada para armazenar uma coleção de itens. Os itens podem ser do mesmo tipo ou tipos diferentes.

A partir do Windows PowerShell 3.0, uma coleção de zero ou um objeto tem algumas propriedades de matrizes.

Criando e inicializando uma matriz

Para criar e inicializar uma matriz, atribua vários valores a uma variável. Os valores armazenados na matriz são delimitados com uma vírgula e separados do nome da variável pelo operador de atribuição (=).

Por exemplo, para criar uma matriz chamada $A que contém os sete valores numéricos (int) de 22, 5, 10, 8, 12, 9 e 80, digite:

$A = 22,5,10,8,12,9,80

A vírgula também pode ser usada para inicializar uma única matriz de itens colocando a vírgula antes do único item.

Por exemplo, para criar uma única matriz de itens chamada $B contendo o valor único de 7, digite:

$B = ,7

Você também pode criar e inicializar uma matriz usando o operador de intervalo (..). O exemplo a seguir cria uma matriz que contém os valores de 5 a 8.

$C = 5..8

Como resultado, $C contém quatro valores: 5, 6, 7 e 8.

Quando nenhum tipo de dados é especificado, o PowerShell cria cada matriz como uma matriz de objetos (System.Object[]). Para determinar o tipo de dados de uma matriz, use o método GetType(). Por exemplo, para determinar o tipo de dados da $A matriz, digite:

$A.GetType()

Para criar uma matriz fortemente tipada, ou seja, uma matriz que pode conter apenas valores de um tipo específico, converta a variável como um tipo de matriz, como string[], long[]ou int32[]. Para converter uma matriz, preceda o nome da variável com um tipo de matriz entre colchetes. Por exemplo, para criar uma matriz de inteiros de 32 bits chamada $ia contendo quatro inteiros (1500, 2230, 3350 e 4000), digite:

[int32[]]$ia = 1500,2230,3350,4000

Como resultado, a $ia matriz pode conter apenas inteiros.

Você pode criar matrizes que são convertidas em qualquer tipo com suporte no .NET. Por exemplo, os objetos que Get-Process recuperam para representar processos são do tipo System.Diagnostics.Process . Para criar uma matriz fortemente tipada de objetos de processo, insira o seguinte comando:

[Diagnostics.Process[]]$zz = Get-Process

O operador de subexpressão da matriz

O operador de subexpressão da matriz cria uma matriz com base nas instruções dentro dela. Seja qual for a instrução dentro do operador que produz, o operador a colocará em uma matriz. Mesmo que haja zero ou um objeto.

A sintaxe do operador de matriz é a seguinte:

@( ... )

Você pode usar o operador de matriz para criar uma matriz de zero ou um objeto. Por exemplo:

$a = @("Hello World")
$a.Count
1
$b = @()
$b.Count
0

O operador de matriz é útil em scripts quando você está recebendo objetos, mas não sabe quantos objetos você obtém. Por exemplo:

$p = @(Get-Process Notepad)

Para obter mais informações sobre o operador de subexpressão de matriz, consulte about_Operators.

Acessando e usando elementos de matriz

Lendo uma matriz

Você pode consultar uma matriz usando seu nome de variável. Para exibir todos os elementos na matriz, digite o nome da matriz. Por exemplo, supondo que $a seja uma matriz que contém inteiros 0, 1, 2, até 9; digitando:

$a
0
1
2
3
4
5
6
7
8
9

Você pode consultar os elementos em uma matriz usando um índice, começando na posição 0. Coloque o número do índice entre colchetes. Por exemplo, para exibir o primeiro elemento na $a matriz, digite:

$a[0]
0

Para exibir o terceiro elemento na $a matriz, digite:

$a[2]
2

Você pode recuperar parte da matriz usando um operador de intervalo para o índice. Por exemplo, para recuperar o segundo para o quinto elementos da matriz, você digitaria:

$a[1..4]
1
2
3
4

Contagem de números negativos do final da matriz. Por exemplo, "-1" refere-se ao último elemento da matriz. Para exibir os últimos três elementos da matriz, em ordem crescente de índice, digite:

$a = 0 .. 9
$a[-3..-1]
7
8
9

Se você digitar índices negativos em ordem decrescente, a saída será alterada.

$a = 0 .. 9
$a[-1..-3]
9
8
7

No entanto, tenha cuidado ao usar essa notação. A notação circula do limite final até o início da matriz.

$a = 0 .. 9
$a[2..-2]
2
1
0
9
8

Além disso, um erro comum é supor que $a[0..-2] se refere a todos os elementos da matriz, exceto o último. Refere-se aos primeiros, últimos e últimos elementos na matriz.

Você pode usar o operador de mais (+) para combinar um intervalo com uma lista de elementos em uma matriz. Por exemplo, para exibir os elementos nas posições de índice 0, 2 e 4 a 6, digite:

$a = 0 .. 9
$a[0,2+4..6]
0
2
4
5
6

Além disso, para listar vários intervalos e elementos individuais, você pode usar o operador de mais. Por exemplo, para listar os elementos zero a dois, quatro a seis e o elemento no oitavo tipo posicional:

$a = 0..9
$a[+0..2+4..6+8]
0
1
2
4
5
6
8

Iterações sobre elementos de matriz

Você também pode usar constructos de loop, como ForEach, Fore While loops, para se referir aos elementos em uma matriz. Por exemplo, para usar um ForEach loop para exibir os elementos na $a matriz, digite:

$a = 0..9
foreach ($element in $a) {
  $element
}
0
1
2
3
4
5
6
7
8
9

O Foreach loop itera pela matriz e retorna cada valor na matriz até chegar ao final da matriz.

O For loop é útil quando você está incrementando contadores enquanto examina os elementos em uma matriz. Por exemplo, para usar um For loop para retornar todos os outros valores em uma matriz, digite:

$a = 0..9
for ($i = 0; $i -le ($a.length - 1); $i += 2) {
  $a[$i]
}
0
2
4
6
8

Você pode usar um While loop para exibir os elementos em uma matriz até que uma condição definida não seja mais verdadeira. Por exemplo, para exibir os elementos na $a matriz enquanto o índice de matriz for menor que 4, digite:

$a = 0..9
$i=0
while($i -lt 4) {
  $a[$i]
  $i++
}
0
1
2
3

Propriedades de matrizes

Count ou Length ou LongLength

Para determinar quantos itens estão em uma matriz, use a Length propriedade ou seu Count alias. Longlength será útil se a matriz contiver mais de 2.147.483.647 elementos.

$a = 0..9
$a.Count
$a.Length
10
10

Rank

Retorna o número de dimensões na matriz. A maioria das matrizes no PowerShell tem apenas uma dimensão. Mesmo quando você pensa que está criando uma matriz multidimensional como o exemplo a seguir:

$a = @(
  @(0,1),
  @("b", "c"),
  @(Get-Process)
)

"`$a rank: $($a.Rank)"
"`$a length: $($a.Length)"
"`$a[2] length: $($a[2].Length)"
"Process `$a[2][1]: $($a[2][1].ProcessName)"

Neste exemplo, você está criando uma matriz unidimensional que contém outras matrizes. Isso também é conhecido como uma matriz irregular. A Rank propriedade provou que isso é unidimensional. Para acessar itens em uma matriz irregular, os índices devem estar entre colchetes separados ([]).

$a rank: 1
$a length: 3
$a[2] length: 348
Process $a[2][1]: AcroRd32

Matrizes multidimensionais são armazenadas em ordem de linha principal. O exemplo a seguir mostra como criar uma matriz verdadeiramente multidimensional.

[string[,]]$rank2 = [string[,]]::New(3,2)
$rank2.rank
$rank2.Length
$rank2[0,0] = 'a'
$rank2[0,1] = 'b'
$rank2[1,0] = 'c'
$rank2[1,1] = 'd'
$rank2[2,0] = 'e'
$rank2[2,1] = 'f'
$rank2[1,1]
2
6
d

Para acessar itens em uma matriz multidimensional, separe os índices usando uma vírgula (,) em um único conjunto de colchetes ([]).

Algumas operações em uma matriz multidimensional, como replicação e concatenação, exigem que essa matriz seja mesclada. O nivelamento transforma a matriz em uma matriz unidimensional de tipo irrestrito. A matriz resultante assume todos os elementos na ordem principal da linha. Considere o seguinte exemplo:

$a = "red",$true
$b = (New-Object 'int[,]' 2,2)
$b[0,0] = 10
$b[0,1] = 20
$b[1,0] = 30
$b[1,1] = 40
$c = $a + $b
$a.GetType().Name
$b.GetType().Name
$c.GetType().Name
$c

A saída mostra que $c é uma matriz unidimensional que contém os itens de e $b na ordem principal da $a linha.

Object[]
Int32[,]
Object[]
red
True
10
20
30
40

Métodos de matrizes

Clear

Define todos os valores de elemento para o valor padrão do tipo de elemento da matriz. O Clear() método não redefine o tamanho da matriz.

No exemplo $a a seguir está uma matriz de objetos.

$a = 1, 2, 3
$a.Clear()
$a | % { $null -eq $_ }
True
True
True

Neste exemplo, $intA é explicitamente digitado para conter inteiros.

[int[]] $intA = 1, 2, 3
$intA.Clear()
$intA
0
0
0

ForEach

Permite iterar todos os elementos na matriz e executar uma determinada operação para cada elemento da matriz.

O ForEach método tem várias sobrecargas que executam operações diferentes.

ForEach(scriptblock expression)
ForEach(scriptblock expression, object[] arguments)
ForEach(type convertToType)
ForEach(string propertyName)
ForEach(string propertyName, object[] newValue)
ForEach(string methodName)
ForEach(string methodName, object[] arguments)

ForEach(expressão scriptblock)

ForEach(expressão scriptblock, argumentos object[] )

Esse método foi adicionado no PowerShell v4.

Observação

A sintaxe requer o uso de um bloco de script. Parênteses serão opcionais se o scriptblock for o único parâmetro. Além disso, não deve haver um espaço entre o método e o parêntese ou a chave de abertura.

O exemplo a seguir mostra como usar o ForEach método . Nesse caso, a intenção é gerar o valor quadrado dos elementos na matriz.

$a = @(0 .. 3)
$a.ForEach({ $_ * $_})
0
1
4
9

Assim como o -ArgumentList parâmetro de ForEach-Object, o arguments parâmetro permite a passagem de uma matriz de argumentos para um bloco de script configurado para aceitá-los.

Para obter mais informações sobre o comportamento de ArgumentList, consulte about_Splatting.

ForEach(digite convertToType)

O ForEach método pode ser usado para converter rapidamente os elementos em um tipo diferente; o exemplo a seguir mostra como converter uma lista de datas de cadeia de caracteres em [DateTime] tipo.

@("1/1/2017", "2/1/2017", "3/1/2017").ForEach([datetime])

Sunday, January 1, 2017 12:00:00 AM
Wednesday, February 1, 2017 12:00:00 AM
Wednesday, March 1, 2017 12:00:00 AM

ForEach(string propertyName)

ForEach(string propertyName, object[] newValue)

O ForEach método também pode ser usado para recuperar rapidamente ou definir valores de propriedade para cada item na coleção.

# Set all LastAccessTime properties of files to the current date.
(dir 'C:\Temp').ForEach('LastAccessTime', (Get-Date))
# View the newly set LastAccessTime of all items, and find Unique entries.
(dir 'C:\Temp').ForEach('LastAccessTime') | Get-Unique
Wednesday, June 20, 2018 9:21:57 AM

ForEach(string methodName)

ForEach(string methodName, object[] arguments)

Lastly, ForEach os métodos podem ser usados para executar um método em cada item da coleção.

("one", "two", "three").ForEach("ToUpper")
ONE
TWO
THREE

Assim como o -ArgumentList parâmetro de ForEach-Object, o Arguments parâmetro permite a passagem de uma matriz de valores para um bloco de script configurado para aceitá-los.

Observação

A partir do Windows PowerShell 3.0, recuperar propriedades e executar métodos para cada item em uma coleção também pode ser realizado usando "Métodos de objetos escalares e coleções". Você pode ler mais sobre isso aqui about_methods.

Where

Permite filtrar ou selecionar os elementos da matriz. O script deve ser avaliado como algo diferente de: zero (0), cadeia de caracteres vazia $false ou $null para que o elemento seja mostrado após o Where. Para obter mais informações sobre a avaliação booliana, consulte about_Booleans.

Há uma definição para o Where método .

Where(scriptblock expression[, WhereOperatorSelectionMode mode
                            [, int numberToReturn]])

Observação

A sintaxe requer o uso de um bloco de script. Parênteses serão opcionais se o scriptblock for o único parâmetro. Além disso, não deve haver um espaço entre o método e o parêntese ou a chave de abertura.

O Expression é scriptblock necessário para filtragem, o mode argumento opcional permite recursos de seleção adicionais e o numberToReturn argumento opcional permite limitar quantos itens são retornados do filtro.

Os valores aceitáveis para mode são:

  • Default (0) – Retornar todos os itens
  • First (1) – Retornar o primeiro item
  • Last (2) – Retornar o último item
  • SkipUntil (3) – Ignorar itens até que a condição seja verdadeira, retornar todos os itens restantes (incluindo o primeiro item para o qual a condição é verdadeira)
  • Until (4) – Retornar todos os itens até que a condição seja verdadeira
  • Split (5) – Retornar uma matriz de dois elementos
    • O primeiro elemento contém itens correspondentes
    • O segundo elemento contém os itens restantes

O exemplo a seguir mostra como selecionar todos os números ímpares da matriz.

(0..9).Where{ $_ % 2 }
1
3
5
7
9

Este exemplo mostra como selecionar as cadeias de caracteres que não estão vazias.

('hi', '', 'there').Where({$_.Length})
hi
there

Default

O Default modo filtra itens usando o Expression scriptblock.

Se um numberToReturn for fornecido, ele especificará o número máximo de itens a serem retornados.

# Get the zip files in the current users profile, sorted by LastAccessTime.
$Zips = dir $env:userprofile -Recurse '*.zip' | Sort-Object LastAccessTime
# Get the least accessed file over 100MB
$Zips.Where({$_.Length -gt 100MB}, 'Default', 1)

Observação

O modo e First o Default modo retornam os primeiros itens (numberToReturn) e podem ser usados de forma intercambiável.

Last

$h = (Get-Date).AddHours(-1)
$logs = dir 'C:\' -Recurse '*.log' | Sort-Object CreationTime
# Find the last 5 log files created in the past hour.
$logs.Where({$_.CreationTime -gt $h}, 'Last', 5)

SkipUntil

O SkipUntil modo ignora todos os objetos em uma coleção até que um objeto passe o filtro de expressão de bloco de script. Em seguida, ele retorna TODOS os itens de coleção restantes sem testá-los. Apenas um item que passa é testado.

Isso significa que a coleção retornada contém itens aprovados e não passados que NÃO foram testados.

O número de itens retornados pode ser limitado passando um valor para o numberToReturn argumento .

$computers = "Server01", "Server02", "Server03", "localhost", "Server04"
# Find the first available online server.
$computers.Where({ Test-Connection $_ }, 'SkipUntil', 1)
localhost

Until

O Until modo inverte o SkipUntil modo. Ele retorna TODOS os itens em uma coleção até que um item passe a expressão de bloco de script. Depois que um item passa a expressão scriptblock, o Where método para de processar itens.

Isso significa que você recebe o primeiro conjunto de itens que não passam do Where método . Depois que um item for aprovado, o restante NÃO será testado ou retornado.

O número de itens retornados pode ser limitado passando um valor para o numberToReturn argumento .

# Retrieve the first set of numbers less than or equal to 10.
(1..50).Where({$_ -gt 10}, 'Until')
# This would perform the same operation.
(1..50).Where({$_ -le 10})
1
2
3
4
5
6
7
8
9
10

Observação

SkipUntil E Until operam sob a premissa de NÃO testar um lote de itens.

Until retorna os itens ANTES da primeira passagem.

SkipUntil retorna todos os itens APÓS a primeira passagem, incluindo o primeiro item que passa.

Split

O Split modo divide ou agrupa itens de coleção em duas coleções separadas. Aqueles que passam a expressão scriptblock e aqueles que não passam.

Se um numberToReturn for especificado, a primeira coleção conterá os itens que passam , para não exceder o valor especificado.

Os objetos restantes, mesmo aqueles que passam o filtro de expressão, são retornados na segunda coleção.

$running, $stopped = (Get-Service).Where({$_.Status -eq 'Running'}, 'Split')
$running
Status   Name               DisplayName
------   ----               -----------
Running  Appinfo            Application Information
Running  AudioEndpointBu... Windows Audio Endpoint Builder
Running  Audiosrv           Windows Audio
...
$stopped
Status   Name               DisplayName
------   ----               -----------
Stopped  AJRouter           AllJoyn Router Service
Stopped  ALG                Application Layer Gateway Service
Stopped  AppIDSvc           Application Identity
...

Observação

Os foreach métodos e where são membros intrínsecos. Para obter mais informações sobre membros intrínsecos, consulte about_Instrinsic_Members

Obter os membros de uma matriz

Para obter as propriedades e os métodos de uma matriz, como a Length propriedade e o método SetValue , use o parâmetro InputObject do Get-Member cmdlet .

Quando você redireciona uma matriz para Get-Member, o PowerShell envia os itens um de cada vez e Get-Member retorna o tipo de cada item na matriz (ignorando duplicatas).

Quando você usa o parâmetro InputObject , Get-Member retorna os membros da matriz.

Por exemplo, o comando a seguir obtém os membros da variável de $a matriz.

Get-Member -InputObject $a

Você também pode obter os membros de uma matriz digitando uma vírgula (,) antes do valor que é canalizado para o Get-Member cmdlet. A vírgula torna a matriz o segundo item em uma matriz de matrizes. O PowerShell canaliza as matrizes uma de cada vez e Get-Member retorna os membros da matriz. Como os dois exemplos a seguir.

,$a | Get-Member

,(1,2,3) | Get-Member

Manipulando uma matriz

Você pode alterar os elementos em uma matriz, adicionar um elemento a uma matriz e combinar os valores de duas matrizes em uma terceira matriz.

Para alterar o valor de um elemento específico em uma matriz, especifique o nome da matriz e o índice do elemento que você deseja alterar e, em seguida, use o operador de atribuição (=) para especificar um novo valor para o elemento. Por exemplo, para alterar o valor do segundo item na $a matriz (posição de índice 1) para 10, digite:

$a[1] = 10

Você também pode usar o método SetValue de uma matriz para alterar um valor. O exemplo a seguir altera o segundo valor (posição de índice 1) da $a matriz para 500:

$a.SetValue(500,1)

Você pode usar o += operador para adicionar um elemento a uma matriz. O exemplo a seguir mostra como adicionar um elemento à $a matriz.

$a = @(0..4)
$a += 5

Observação

Quando você usa o operador , o += PowerShell realmente cria uma nova matriz com os valores da matriz original e o valor agregado. Isso poderá causar problemas de desempenho se a operação for repetida várias vezes ou o tamanho da matriz for muito grande.

Não é fácil excluir elementos de uma matriz, mas você pode criar uma nova matriz que contenha apenas elementos selecionados de uma matriz existente. Por exemplo, para criar a $t matriz com todos os elementos na $a matriz, exceto para o valor na posição de índice 2, digite:

$t = $a[0,1 + 3..($a.length - 1)]

Para combinar duas matrizes em uma única matriz, use o operador de mais (+). O exemplo a seguir cria duas matrizes, combina-as e exibe a matriz combinada resultante.

$x = 1,3
$y = 5,9
$z = $x + $y

Como resultado, a $z matriz contém 1, 3, 5 e 9.

Para excluir uma matriz, atribua um valor de $null à matriz. O comando a seguir exclui a matriz na $a variável .

$a = $null

Você também pode usar o Remove-Item cmdlet , mas atribuir um valor de $null é mais rápido, especialmente para matrizes grandes.

Matrizes de zero ou um

A partir do Windows PowerShell 3.0, uma coleção de zero ou um objeto tem as Count propriedades e Length . Além disso, você pode indexar em uma matriz de um objeto. Esse recurso ajuda você a evitar erros de script que ocorrem quando um comando que espera uma coleção obtém menos de dois itens.

Os exemplos a seguir demonstram esse recurso.

Zero objetos

$a = $null
$a.Count
$a.Length
0
0

Um objeto

$a = 4
$a.Count
$a.Length
$a[0]
$a[-1]
1
1
4
4

Suporte de indexação para o Sistema.Tuple Objetos

O PowerShell 6.1 adicionou o suporte para acesso indexado de Tuple objetos, semelhante a matrizes. Por exemplo:

PS> $tuple = [Tuple]::Create(1, 'test')
PS> $tuple[0]
1
PS> $tuple[1]
test
PS> $tuple[0..1]
1
test
PS> $tuple[-1]
test

Ao contrário de matrizes e outros objetos de coleção, Tuple os objetos são tratados como um único objeto quando passados pelo pipeline ou por parâmetros que dão suporte a matrizes de objetos.

Para obter mais informações, consulte System.Tuple.

Enumeração de acesso a membro

A partir do PowerShell 3.0, quando você usa o operador de acesso de membro para acessar um membro que não existe em uma coleção de listas, o PowerShell enumera automaticamente os itens na coleção e tenta acessar o membro especificado em cada item. Para obter mais informações, consulte about_Member-Access_Enumeration.

Exemplos

O exemplo a seguir cria dois novos arquivos e armazena os objetos resultantes na variável $filesde matriz . Como o objeto de matriz não tem o Lastmembro WriteTime , o valor de LastWriteTime é retornado para cada item na matriz.

$files = (New-Item -Type File -Force '/temp/t1.txt'),
         (New-Item -Force -Type File '/temp/t2.txt')
$files.LastWriteTime
Friday, June 25, 2021 1:21:17 PM
Friday, June 25, 2021 1:21:17 PM

A enumeração de acesso a membros permite que você obtenha valores de itens em uma coleção, mas não defina valores em itens em uma coleção. Por exemplo:

$files.LastWriteTime = (Get-Date).AddDays(-1)
InvalidOperation: The property 'LastWriteTime' cannot be found on this object.
Verify that the property exists and can be set.

Para definir os valores, você deve usar um método .

$files.set_LastWriteTime((Get-Date).AddDays(-1))
$files.LastWriteTime
Thursday, June 24, 2021 1:23:30 PM
Thursday, June 24, 2021 1:23:30 PM

O set_LastWriteTime() método é um membro oculto do objeto FileInfo . O exemplo a seguir mostra como localizar membros que têm um método ocultoset .

$files | Get-Member | Where-Object Definition -like '*set;*'
   TypeName: System.IO.FileInfo

Name              MemberType Definition
----              ---------- ----------
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}
IsReadOnly        Property   bool IsReadOnly {get;set;}
LastAccessTime    Property   datetime LastAccessTime {get;set;}
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}
LastWriteTime     Property   datetime LastWriteTime {get;set;}
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}

Cuidado

Como o método é executado para cada item na coleção, deve-se tomar cuidado ao chamar métodos usando a enumeração de membro.

Confira também