- 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 -join
operator 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 Add
mé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?
Deixe uma resposta