Compartilhar via


Sobre matrizes

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 microsoft .NET Framework. 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 loops ForEach, For e While, para se referir aos elementos em uma matriz. Por exemplo, para usar um loop ForEach 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 loop Foreach itera pela matriz e retorna cada valor na matriz até chegar ao final da matriz.

O loop For é útil quando você está incrementando contadores enquanto examina os elementos em uma matriz. Por exemplo, para usar um loop For 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 loop While 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 or Length or 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)
)

[int]$r = $a.Rank
"`$a rank: $r"
$a rank: 1

O exemplo a seguir mostra como criar uma matriz verdadeiramente multidimensional usando o .Net Framework.

[int[,]]$rank2 = [int[,]]::new(5,5)
$rank2.rank
2

Métodos de matrizes

Limpar

Define todos os valores de elemento para o valor padrão do tipo de elemento da matriz. O método Clear() 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 método ForEach 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(scriptblock expression, object[] arguments)

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 de abertura ou chave.

O exemplo a seguir mostra como usar o método foreach. 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(type 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 para [DateTime] o 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)

Por fim, 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 argumentos 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 para qualquer coisa diferente de: zero (0), cadeia $false de caracteres vazia ou $null para que o elemento seja mostrado após o Where

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 de abertura ou chave.

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:

  • Padrão (0) – Retornar todos os itens
  • Primeiro (1) – Retornar o primeiro item
  • Último (2) – Retornar o último item
  • SkipUntil (3) – Ignorar itens até que a condição seja verdadeira, retornar os itens restantes
  • Até (4) – Retornar todos os itens até que a condição seja verdadeira
  • Divisão (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.

Último

$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 aprovado é testado.

Isso significa que a coleção retornada contém itens aprovados e não aprovados 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

Até

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 método interrompe o Where processamento de 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 de passagem.

Divisão

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 o fazem.

Se um numberToReturn for especificado, a primeira coleção conterá os itens de passagem , 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
...

Obter os membros de uma matriz

Para obter as propriedades e métodos de uma matriz, como a propriedade Length 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 próximos dois exemplos.

,$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 determinado elemento 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 adicionado. 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 contém 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, as combina 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 grandes matrizes.

Matrizes de zero ou um

A partir do Windows PowerShell 3.0, uma coleção de zero ou um objeto tem a propriedade Count 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 objetos System.Tuple

O PowerShell 6.1 adicionou o suporte para acesso indexado de objetos tupla , 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, os objetos Tuple 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.

Confira também