• 10/08/2020
  • 24 minutos para ler
    • j
    • h
    • s
    • V

Matrizes são fundamentais linguagem característica da maioria das linguagens de programação. São uma colecção de valores ou objectos difíceis de evitar. Vamos ver de perto os arrays e tudo o que têm para oferecer.,

Nota

a versão original deste artigo apareceu no blog escrito por @KevinMarquette. A equipa de showershell agradece ao Kevin por partilhar este conteúdo connosco. Por favor, confira seu blog atPowerShellExplained.com.

o que é um array?

eu vou começar com uma descrição técnica básica do que as arrays são e como elas são usadas pela maioria das linguagens de programação antes de eu mudar para as outras maneiras que o PowerShell faz uso delas.

um array é uma estrutura de dados que serve como uma coleção de vários itens., Você pode iterar sobre o array ou acessar itens individuais usando um índice. O array é criado como um bloco sequencial de Memory onde cada valor é armazenado ao lado do outro.vou tocar em cada um desses detalhes à medida que avançamos.

uso básico

porque as matrizes são uma característica básica de PowerShell, existe uma sintaxe simples para trabalhar com elas em PowerShell.,

Criar uma matriz

Uma matriz vazia pode ser criado usando @()

PS> $data = @()PS> $data.count0

podemos criar uma matriz e sementes com valores apenas colocando-os em @() parênteses.

PS> $data = @('Zero','One','Two','Three')PS> $data.count4PS> $dataZeroOneTwoThree

esta matriz tem 4 itens. Quando chamamos a variável

, vemos a lista dos nossos itens. Se for uma confusão de cordas, então temos uma linha por corda.

Podemos declarar um array em várias linhas. A vírgula é opcional neste caso e geralmente à esquerda.,

$data = @( 'Zero' 'One' 'Two' 'Three')

eu prefiro declarar minhas matrizes em várias linhas como essa. Não só fica mais fácil de ler quando você tem vários itens, como também torna mais fácil de comparar com versões anteriores ao usar o sourcecontrol.

outra sintaxe

é comumente entendido que @() é a sintaxe para criar um array, mas listswork separados por vírgulas na maior parte do tempo.,

$data = 'Zero','One','Two','Three'

Saída de Gravação para criar arrays

Um pouco cool truque que vale a pena mencionar é que você pode usar Write-Output para criar rapidamente stringsat o console.

$data = Write-Output Zero One Two Three

isto é útil porque você não tem que colocar aspas em torno das strings quando o parâmetro aceita strings. Nunca faria isto num guião, mas é um jogo justo na consola.

acessando itens

Agora que você tem um array com itens nele, você pode querer acessar e atualizar esses itens.,

Offset

para aceder a itens individuais, usamos os parêntesis com um valor offset a partir de 0. Este ishow temos o primeiro item na matriz:

PS> $data = 'Zero','One','Two','Three'PS> $dataZero

A razão pela qual utilizamos zero aqui é porque o primeiro item está no início da lista, para nós usean deslocamento de 0 itens para chegar a ele. Para chegar ao segundo item, precisamos usar um offset de 1 toskip o primeiro item.

PS> $dataOne

isto significaria que o último item está na posição 3.,

PS> $dataThree

Index

Now you can see why I picked the values that I did for this example. Eu introduzi isto como uma compensação porque é isso que realmente é, mas esta compensação é mais comumente referida como um índice. Anindex que começa em 0. Para o resto deste artigo vou chamar a compensação de um índice.

truques de índice especiais

na maioria das línguas, só pode indicar um único número como índice e obter um único item de volta.PowerShell é muito mais flexível. Você pode usar vários índices ao mesmo tempo., Ao fornecer uma lista de anexos, podemos seleccionar vários itens.

PS> $dataZeroTwoThree

as rubricas são devolvidas com base na ordem dos índices fornecidos. Se duplicares um índice, recebes esse item das duas vezes.

PS> $dataThreeZeroThree

podemos especificar uma sequência de números com o built-in .. operador.

PS> $dataOneTwoThree

isto também funciona ao contrário.

PS> $dataThreeTwoOne

pode utilizar valores de índice negativos para compensar a partir do fim. Então, se você precisar do último item da lista, você pode usar -1.,

PS> $dataThree

Fora dos limites

Na maioria dos idiomas, se você tentar acessar um índice de um item que está após o final da matriz, youwould obter algum tipo de erro ou uma exceção. O PowerShell silenciosamente não devolve nada.

PS> $null -eq $dataTrue

não é Possível indexar uma matriz nula

Se a variável é $null e tenta índice é como uma matriz, você ganha umSystem.Management.Automation.RuntimeException exceção com a mensagem deCannot index into a null array.,

PS> $empty = $nullSP> $emptyError: Cannot index into a null array.

portanto, certifique-se que as suas matrizes não são $null antes de tentar aceder aos elementos dentro delas.

Contagem

Arrays e outras coleções têm uma propriedade de contagem que lhe diz quantos itens estão na matriz.

PS> $data.count4

PowerShell 3.0 adicionou uma propriedade de contagem para a maioria dos objetos. você pode ter um único objeto e ele deve lhe dar uma contagem de 1.

PS> $date = Get-DatePS> $date.count1

mesmo $null tem uma propriedade de contagem, excepto que devolve 0.,

PS> $null.count0

Existem algumas armadilhas aqui que eu vou revisitar quando eu cobrir a verificação de $null ou vazio arrayslater neste artigo.

erros Off-by-one

um erro de programação comum é criado porque as matrizes começam no índice 0. Os erros “Off-by-one” podem ser introduzidos de duas formas.

a primeira é pensando mentalmente que você quer o segundo item e usando um índice de 2 e realmente obter o terceiro item. Ou pensando que você tem quatro itens e você quer o último item, então você usa o Conde para acessar o último item.,

$data

PowerShell é perfeitamente feliz em deixá-lo fazer isso e dar-lhe exatamente qual item existe no índice 4:$null. Você deve estar usando $data.count - 1 ou o -1 que aprendemos acima.

PS> $dataThree

é aqui que pode usar o índice -1 para obter o último elemento.

PS> $dataThree

Lee Dailey also pointed to me that we can use $data.GetUpperBound(0) to get the max indexnumber.,

PS> $data.GetUpperBound(0)3PS> $dataThree

a segunda maneira mais comum é ao iterar a lista e não parar no momento certo. I’llrevisit this when we talk about using the for loop.

atualizando itens

podemos usar o mesmo índice para atualizar itens existentes na matriz. Isso nos dá acesso direto a itens individuais de capacetes.

$data = 'dos'$data = 'tres'

se tentarmos atualizar um item que já passou o último elemento, então teremos umIndex was outside the bounds of the array. Erro.

vou revisitar isso mais tarde quando eu falar sobre como fazer um array maior.,

iteração

em algum momento, você pode precisar andar ou iterar a lista inteira e realizar alguma ação para eachitem na matriz.

Pipeline

Arrays and the PowerShell pipeline are meant for each other. Esta é uma das formas mais simples de superar esses valores. Quando você passa um array para um pipeline, cada item dentro do array é processado individualmente.

PS> $data = 'Zero','One','Two','Three'PS> $data | ForEach-Object {"Item: "}Item: Item: Item: Item: 

Se você ainda não viu $PSItem antes, só sei que é a mesma coisa que $_., Você pode usar eitherone porque ambos representam o objeto atual no pipeline.

ForEach loop

The ForEach loop works well with collections. Usando a sintaxe:foreach ( <variable> in <collection> )

foreach ( $node in $data ){ "Item: "}

ForEach método

eu tendem a esquecer-se sobre isso, mas ele funciona bem para operações simples. PowerShell permite-lhe ligar para .ForEach() numa colecção.

PS> $data.foreach({"Item "})Item Item Item Item 

The .foreach() takes a parameter that is a script block., Você pode deixar os parênteses e apenas fornecer o bloco de script.

$data.foreach{"Item "}

esta é uma sintaxe menos conhecida, mas funciona da mesma forma. Este método foreach foi adicionado inPowerShell 4.0.

para loop

o for loop é usado pesadamente na maioria das outras línguas, mas você não vê muito em PowerShell. Quando você vê isso, muitas vezes é no contexto de caminhar uma matriz.

for ( $index = 0; $index -lt $data.count; $index++){ "Item: " -f $data}

A primeira coisa que fazemos é inicializar um $index 0., Em seguida, adicionamos a condição de que $index deve ser menor que$data.count. Finalmente, especificamos que cada vez que fazemos loop que me deve aumentar o index por 1. Neste caso $index++é o diminutivo de$index = $index + 1.

sempre que estiver a utilizar umfor loop, preste especial atenção à condição. Eu usei$index -lt $data.count aqui. É fácil obter a condição ligeiramente errada para obter um off-by-oneerror em sua lógica., Using $index -le $data.count or $index -lt ($data.count - 1) are ever soslightly wrong. Isso faria com que o seu resultado processasse muitos ou poucos itens. Este é o erro clássico de um por um.

ciclo de comutação

Este é um que é fácil de ignorar. Se você fornecer um array para uma instrução switch, itcheck cada item no array.

$data = 'Zero','One','Two','Three'switch( $data ){ 'One' { 'Tock' } 'Three' { 'Tock' } Default { 'Tick' }}
TickTockTickTock

Há um monte de coisas legais que podemos fazer com a instrução switch. Tenho outro artigo dedicado a isto.,

  • tudo o que alguma vez quis saber sobre a declaração de switch

A actualizar os valores

quando a sua lista é uma colecção de string ou inteiros (tipos de valor), por vezes poderá querer alterar os valores na lista à medida que os contorna. A maioria dos loops acima usam uma variável no loop que contém uma cópia do valor. Se você atualizar essa variável, o valor original no array não é atualizado.

a exceção a essa afirmação é o for loop., Se você quiser andar por um array e atualizar valores dentro dele, então o for loop é o que você está procurando.

for ( $index = 0; $index -lt $data.count; $index++ ){ $data = "Item: " -f $data}

este exemplo toma um valor por índice, faz algumas alterações, e então usa esse mesmo índice para atribuir de volta.

Arrays of Objects

So far, the only thing we have placed in an array is a value type, but arrays can also containobjects.

$data = @( @{FirstName='Kevin';LastName='Marquette'} @{FirstName='John'; LastName='Doe'})

muitos cmdlets devolvem colecções de objectos como arrays quando os atribui a uma variável.,

$processList = Get-Process

Todas as características básicas de que já falamos ainda se aplicam a matrizes de objetos com um fewdetails que vale a pena destacar.

acessando propriedades

podemos usar um índice para acessar um item individual em uma coleção assim como com tipos de valor.

PS> $dataFirstName LastName----- ----Kevin Marquette

podemos aceder e actualizar as propriedades directamente.,

PS> $data.FirstNameKevinPS> $data.FirstName = 'Jay'PS> $dataFirstName LastName----- ----Jay Marquette

propriedades da Matriz

Normalmente você teria para enumerar a lista completa como esta o acesso a todas as propriedades de:

PS> $data | ForEach-Object {$_.LastName}MarquetteDoe

Ou usando o Select-Object -ExpandProperty cmdlet.

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

But PowerShell offers us the ability to requestLastName directly. O PowerShell enumera-nos todos e devolve uma lista limpa.

PS> $data.LastNameMarquetteDoe

a enumeração ainda acontece, mas não vemos a complexidade por trás dela.,

Where-Object filtering

This is where Where-Object comes in so we can filter and select what we want out of the arraybased on the properties of the object.

PS> $data | Where-Object {$_.FirstName -eq 'Kevin'}FirstName LastName----- ----Kevin Marquette

podemos escrever que a mesma consulta para obter o FirstName estamos procurando.

$data | Where FirstName -eq Kevin

, Onde()

Matrizes de ter uma Where() método que permite que você especifique um scriptblock para o filtro.

$data.Where({$_.FirstName -eq 'Kevin'})

Esta característica foi adicionada em PowerShell 4.0.,

atualizando objetos em loops

com tipos de valor, a única maneira de atualizar o array é usar um loop for Porque precisamos saber o Index para substituir o valor. Temos mais opções com objetos porque eles são tipos de referência. Aqui está um exemplo rápido:

foreach($person in $data){ $person.FirstName = 'Kevin'}

este loop está caminhando cada objeto no $data array. Como os objetos são tipos de referência, o$person referências variáveis o mesmo objeto exato que está na matriz. Assim, atualizações para itsproperties atualizam o original.,

Você ainda não pode substituir todo o objeto desta forma. Se você tentar atribuir um novo objeto à variável

, Você está atualizando a referência da variável para algo mais que já não aponta para o objeto original no array. Isto não funciona como seria de esperar:

foreach($person in $data){ $person = @{ FirstName='Kevin' LastName='Marquette' }}

operadores

os operadores em PowerShell também trabalham em matrizes. Alguns deles trabalham de forma ligeiramente diferente.

-join

The-join operator is the most obvious one so let’s look at it first., I like the -joinoperator and use it often. Junta todos os elementos do array com o carácter ou cadeia de caracteres que indicar.

PS> $data = @(1,2,3,4)PS> $data -join '-'1-2-3-4PS> $data -join ','1,2,3,4

Uma das características que eu gosto sobre o -join operador é que ele lida com itens únicos.

i use this inside logging and verbose messages.

PS> $data = @(1,2,3,4)PS> "Data is $($data -join ',')."Data is 1,2,3,4.

-join $array

Aqui está um truque inteligente que Lee Dailey me apontou., Se alguma vez quiser juntar-se a tudo sem um delimitador, em vez de fazer isto:

PS> $data = @(1,2,3,4)PS> $data -join $null1234

pode usar -join com o array como parâmetro sem prefixo. Olha para este exemplo de que estou a falar.

PS> $data = @(1,2,3,4)PS> -join $data1234

-substituir e -split

Os outros operadores, como -replace e -split executar em cada item na matriz. Não posso dizer que alguma vez os tenha usado desta maneira, mas aqui está um exemplo.,

PS> $data = @('ATX-SQL-01','ATX-SQL-02','ATX-SQL-03')PS> $data -replace 'ATX','LAX'LAX-SQL-01LAX-SQL-02LAX-SQL-03

-contém

-contains operador permite que você verifique uma matriz de valores para ver se ele contém uma specifiedvalue.

PS> $data = @('red','green','blue')PS> $data -contains 'green'True

no

Quando você tem um único valor que você gostaria de verificar se corresponde a um dos vários valores, você canuse -in operador. O valor seria no lado esquerdo e o array no lado direito do operador.

PS> $data = @('red','green','blue')PS> 'green' -in $dataTrue

isto pode ficar caro se a lista for grande. Eu uso frequentemente um padrão regex se eu estou verificando mais thana poucos valores.,

PS> $data = @('red','green','blue')PS> $pattern = "^({0})$" -f ($data -join '|')PS> $pattern^(red|green|blue)$PS> 'green' -match $patternTrue

-eq and-ne

igualdade e arrays podem ficar complicados. Quando o array está do lado esquerdo, cada item fica preparado. Em vez de devolver True, devolve o objecto correspondente.

PS> $data = @('red','green','blue')PS> $data -eq 'green'green

quando você usa o -ne operador, obtemos todos os valores que não são iguais ao nosso valor.

PS> $data = @('red','green','blue')PS> $data -ne 'green'redblue

Quando você usar isso em um if() instrução, um valor que é retornado é um True valor., Se não for devolvido nenhum valor, então é um valor

. Ambas as declarações seguintes avaliam paraTrue.

$data = @('red','green','blue')if ( $data -eq 'green' ){ 'Green was found'}if ( $data -ne 'green' ){ 'And green was not found'}

i’ll revisit this in a moment when we talk about testing for $null.

-match

The-match o operador tenta corresponder cada item da colecção.

PS> $servers = @( 'LAX-SQL-01' 'LAX-API-01' 'ATX-SQL-01' 'ATX-API-01')PS> $servers -match 'SQL'LAX-SQL-01ATX-SQL-01

Quando você usar -match com um único valor de uma variável especial $Matches fica preenchida com matchinfo., Este não é o caso quando um array é processado desta forma.

Podemos ter a mesma abordagem com Select-String.

$servers | Select-String SQL

vou dar uma olhada no Select-String-match e o $matches variável em outro post calledThe muitas maneiras de usar regex.

$null ou empty

Testing for$null or empty arrays can be tricky. Aqui estão as armadilhas comuns com matrizes.

em um relance, esta declaração parece que deve funcionar.,

if ( $array -eq $null){ 'Array is $null'}

But I just went over how -eq checks each item in the array. Assim, podemos ter uma array de severalitems com um único $valor nulo e de avaliar a $true

$array = @('one',$null,'three')if ( $array -eq $null){ 'I think Array is $null, but I would be wrong'}

é por Isso que é uma das melhores práticas para colocar o $null no lado esquerdo do operador. Este cenário torna-se, assim, um cenário não problemático.

if ( $null -eq $array ){ 'Array actually is $null'}

a $null array não é a mesma coisa que um array vazio. Se você sabe que tem um array, verifique o número de objetos nele., If the array is $null, the count is 0.

if ( $array.count -gt 0 ){ "Array isn't empty"}

há mais uma armadilha para vigiar aqui. Você pode usar o count mesmo que você tenha um único objeto, a menos que esse objeto seja um PSCustomObject. Este é um bug que é fixado em PowerShell 6.1.Isso é uma boa notícia, mas muitas pessoas ainda estão no 5.1 e precisam de ter cuidado com isso.

PS> $object = @{Name='TestObject'}PS> $object.count$null

se ainda estiver em PowerShell 5.1, pode embrulhar o objecto numa lista antes de verificar a contagem comuta uma contagem precisa.,

if ( @($array).count -gt 0 ){ "Array isn't empty"}

To fully play it safe, check for $null, then check the count.

if ( $null -ne $array -and @($array).count -gt 0 ){ "Array isn't empty"}

All-eq

recentemente vi alguém perguntar como verificar se cada valor de uma matriz corresponde a um dado valor.O Reddit user / u / bis tinha esta solução inteligente que verifica quaisquer valores incorretos e então flips o resultado.

$results = Test-Somethingif ( -not ( $results -ne 'Passed') ){ 'All results a Passed'}

adicionando a arrays

neste ponto, você está começando a se perguntar como adicionar itens a uma matriz. A resposta rápida é que você não pode. um array é um tamanho fixo na memória., Se você precisa cultivá-lo ou adicionar um único item a ele, então você precisa criar um novo array e copiar todos os valores do array antigo. Isso soa como um monte de trabalho, no entanto, PowerShell esconde a complexidade de criar o novo array. PowerShellimplements the addition operator (+) for arrays.

Nota

PowerShell não implementa uma operação de subtracção. Se quiser uma alternativa flexível ao anarray, terá de usar um genérico List objecto.,

Array addition

We can use the addition operator with arrays to create a new array. Então dadas estas duas matrizes:

$first = @( 'Zero' 'One')$second = @( 'Two' 'Three')

podemos adicioná-las juntas para obter uma nova matriz.

PS> $first + $secondZeroOneTwoThree

Além de é igual a +=

podemos criar uma nova matriz no lugar e adicionar um item como este:

$data = @( 'Zero' 'One' 'Two' 'Three')$data += 'four'

Basta lembrar que a cada vez que você usar += que você está a duplicação e a criação de uma nova matriz. Não se trata de um problema para pequenos conjuntos de dados, mas tem uma escala extremamente fraca.,

atribuição de Pipeline

pode atribuir os resultados de qualquer pipeline a uma variável. É um array se contiver multipleitems.

$array = 1..5 | ForEach-Object { "ATX-SQL-$PSItem"}

normalmente, quando pensamos em usar o pipeline, pensamos nos típicos liners de carapaça única. Podemos ver o pipeline com declarações foreach() e outros loops. Então, em vez de adicionar itens a anarray em um loop, podemos deixar os itens no pipeline.

$array = foreach ( $node in (1..5)){ "ATX-SQL-$node"}

Array Types

By default, an array in PowerShell is created as a ] type., Isto permite-lhe conter qualquer tipo de objecto ou valor. Isto funciona porque tudo é herdado do tipo PSObject.

matrizes fortemente tipadas

você pode criar um array de qualquer tipo usando uma sintaxe similar. Quando você cria um array fortemente digitado, ele só pode conter valores ou objetos do tipo especificado.

ArrayList

adicionar itens a um array é uma de suas maiores limitações, mas existem algumas outras coleções que podemos recorrer para resolver este problema.,

O id

é comumente uma das primeiras coisas em que pensamos quando precisamos de um array que seja mais rápido para trabalhar. Age como uma matriz de objetos em todos os lugares que precisamos, mas lida com adições rapidamente.

Aqui está como criamos um id

e adicionamos itens a ele.

$myarray = ::new()$myArray.Add('Value')

we are calling into. net to get this type. Neste caso, estamos usando o construtor padrão para criá-lo. Então chamamos o método Add para adicionar um item a ele.,

A razão pela qual estou usando no início da linha é para suprimir o código de retorno. Some.NET as chamadas fazem isso e podem criar saída inesperada.

Se os únicos dados que você tem em seu array são strings, então também dê uma olhada no usingStringBuilder. É quase a mesma coisa, mas tem alguns métodos que são apenas para lidar com cordas. O StringBuilder é especialmente concebido para o desempenho.

é comum ver as pessoas se moverem paraArrayList de arrays. Mas vem de uma época em que C# não tinha suporte genérico., ArrayList é substituído no suporte para o genérico List

Lista Genérica

Um tipo genérico é um tipo especial em C# que define uma generalizada de classe e o usuário especifica o data tipos que ele usa quando criado. Então, se você quiser uma lista de números ou strings, você definirá que você quer uma lista de int ou string tipos.

Aqui está como você cria uma lista para strings.

$mylist = ]::new()

ou uma lista para números.,

$mylist = ]::new()

podemos lançar uma matriz existente para uma lista como esta, sem criar o objeto primeiro:

$mylist = ]@(1,2,3)

Nós podemos encurtar a sintaxe com o using namespace instrução no PowerShell 5 e versões mais recentes. A instruçãousing precisa ser a primeira linha do seu script. Ao declarar um espaço de nomes, Powershellets você o deixa fora dos tipos de dados quando você os referencia.

Isto torna oList muito mais utilizável.,

Você tem um método similar Add disponível para você. Ao contrário do ArrayList, não há valor de retorno sobre Addmétodo de modo que não temos que it.

$myList.Add(10)

e ainda podemos acessar os elementos como outras matrizes.

PS> $myList10

Lista

Você pode ter uma lista de qualquer tipo, mas quando você não sabe o tipo de objetos, você pode usar] para contê-los.,

$list = ]::new()

Remove()

ArrayList e o genérico List apoio remover itens da coleção.

using namespace System.Collections.Generic$myList = ]@('Zero','One','Two','Three')$myList.Remove("Two")ZeroOneThree

ao trabalhar com tipos de valor, remove o primeiro da lista. Você pode chamá-lo vezes sem conta novamente para continuar a remover esse valor. Se você tem tipos de referência, você tem que fornecer o objetivo que você quer removido.,

]$drives = Get-PSDrive$drives.remove($drives)

$delete = $drives$drives.remove($delete)

O método remove retorna true se ele foi capaz de encontrar e remover o item da coleção.

mais coleções

Existem muitas outras coleções que podem ser usadas, mas estas são as boas substituições genéricas de array.Se você está interessado em aprender mais sobre estas opções, dê uma olhada neste gist que Mark Kraus juntos.

outras nuances

Agora que eu cobri todas as funcionalidades principais, Aqui estão mais algumas coisas que eu queria tomention antes de terminar isto.,

matrizes pré-dimensionadas

eu mencionei que você não pode mudar o tamanho de um array uma vez que ele é criado. Nós podemos criar um array de um tamanho pré-determinado chamando-o com onew($size) construtor.

$data = ]::new(4)$data.count4

multiplicando arrays

um pequeno truque interessante é que você pode multiplicar um array por um inteiro.

PS> $data = @('red','green','blue')PS> $data * 3redgreenblueredgreenblueredgreenblue

inicializar com 0

um cenário comum é que você quer criar um array com todos os zeros. Se você só vai ter números inteiros, um conjunto fortemente digitado de números inteiros é igual a todos os zeros.,

PS> ]::new(4)0000

podemos usar o truque de multiplicação para fazer isso também.

PS> $data = @(0) * 4PS> $data0000

a coisa boa sobre o truque de multiplicação é que você pode usar qualquer valor. Então, se você tivesse 255 como seu valor padrão, esta seria uma boa maneira de fazê-lo.

PS> $data = @(255) * 4PS> $data255255255255

matrizes Aninhadas

Uma matriz dentro de uma matriz é chamada de uma matriz aninhada. Eu não uso isso muito em PowerShell mas eu usei-os mais em outras línguas. Considere o uso de uma variedade de arrays quando seus dados se encaixam em um padrão gridlike.,

Aqui estão duas maneiras de criar um array bidimensional.

$data = @(@(1,2,3),@(4,5,6),@(7,8,9))$data2 = @( @(1,2,3), @(4,5,6), @(7,8,9))

a vírgula É muito importante nesses exemplos. Eu dei um exemplo anterior de uma matriz normal onmultiplicando linhas onde a vírgula era opcional. Não é o caso de uma matriz multidimensional.

A forma como usamos a notação de índice muda ligeiramente agora que temos uma matriz aninhada. Usando o $data acima, é assim que acederemos ao valor 3.

PS> $outside = 0PS> $inside = 2PS> $data3

Add a set of bracket for each level of array nesting., O primeiro conjunto de suportes é para a matriz mais externa e depois você trabalha o seu caminho a partir daí.

Write-Output-NoEnumerate

PowerShell gosta de desembrulhar ou enumerar arrays. Este é um aspecto central da forma como a PowerShell usa a linha da frente, mas há momentos em que você não quer que isso aconteça.

I comumente canalizar objetos paraGet-Member para aprender mais sobre eles. Quando eu encaminho um array para ele, itgets desembrulhados e Get-Member vê os membros do array e não o array real.,

PS> $data = @('red','green','blue')PS> $data | Get-MemberTypeName: System.String...

para evitar que a unwrap do array, você pode usar Write-Object -NoEnumerate.

PS> Write-Output -NoEnumerate $data | Get-MemberTypeName: System.Object...

i have a second way that’s more of a hack (and I try to avoid hacks like this). Você pode colocar acomma na frente da matriz antes de conectá-la.

PS> ,$data | Get-MemberTypeName: System.Object...

Return an array

This unwrapping of arrays also happens when you output or return values from a function. Ainda pode obter um array se atribuir a saída a uma variável, pelo que esta não é normalmente uma questão.

a captura é que você tem uma nova matriz., Se isso alguma vez for um problema, você pode usarWrite-Output -NoEnumerate $array ou return ,$array para trabalhar em torno dele.mais alguma coisa?