• 10/08/2020
  • le 24 minutes pour lire
    • j
    • h
    • s
    • V

les Tableaux sont un langage fondamental caractéristique de la plupart des langages de programmation. Il s’agit d’une collection de valeurs ou d’objets difficiles à éviter. Regardons de près les tableaux et tout ce qu’ilsont à offrir.,

Remarque

La version originale de cet article est parue sur le blog écrit par @KevinMarquette. L’équipe de PowerShell remercie Kevin d’avoir partagé ce contenu avec nous. Veuillez consulter son blog atPowerShellExplained.com.

Qu’est-ce qu’un tableau?

je vais commencer par une description technique de base de ce que sont les tableaux et comment ils sont utilisés par la plupart des langages de programmation avant de passer aux autres façons dont PowerShell les utilise.

un tableau est une structure de données qui sert de collection de plusieurs éléments., Vous pouvez parcourir le tableau ou accéder à des éléments individuels à l’aide d’un index. Le tableau est créé comme un morceau séquentiel de mémoire où chaque valeur est stockée juste à côté de l’autre.

je vais aborder chacun de ces détails au fur et à mesure.

utilisation de base

parce que les tableaux sont une fonctionnalité de base de PowerShell, il existe une syntaxe simple pour travailler avec eux dans PowerShell.,

Créer un tableau

Un tableau vide peut être créé à l’aide de @()

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

On peut créer un tableau et des semences avec des valeurs en les plaçant dans le @() parenthèses.

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

Ce tableau a 4 éléments. Lorsque nous appelons la variable$data, nous voyons la liste de nos éléments. Si c’est un Array de chaînes, alors nous obtenons une ligne par chaîne.

nous pouvons déclarer un tableau sur plusieurs lignes. La virgule est facultative dans ce cas et généralement laissée.,

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

je préfère déclarer mes tableaux sur plusieurs lignes comme ça. Non seulement il devient plus facile à lire quandvous avez plusieurs éléments, il est également plus facile de comparer aux versions précédentes lors de l’utilisation de sourcecontrol.

autre syntaxe

Il est communément admis que@() est la syntaxe pour créer un tableau, mais les listes séparées par des virgules fonctionnent la plupart du temps.,

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

Write-Output pour créer des tableaux

Une petite astuce intéressante à mentionner est que vous pouvez utiliser Write-Output pour créer rapidement des chaînes sur la console.

$data = Write-Output Zero One Two Three

c’est pratique car vous n’avez pas besoin de mettre des guillemets autour des chaînes lorsque le paramètre acceptsstrings. Je ne ferais jamais cela dans un script mais c’est un jeu juste dans la console.

Accès aux éléments

Maintenant que vous avez un tableau avec des objets, vous pouvez accéder et mettre à jour ces éléments.,

Offset

pour accéder à des éléments individuels, nous utilisons les crochets avec une valeur de décalage commençant à 0. Ceci ishow nous obtenons le premier élément de notre tableau:

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

la raison pour laquelle nous utilisons zéro ici est parce que le premier élément est au début de la liste, nous utilisons donc un décalage de 0 éléments pour y accéder. Pour obtenir le deuxième point, nous aurions besoin d’utiliser un décalage de 1 toskip le premier élément.

PS> $dataOne

cela signifierait que le dernier élément est au décalage 3.,

PS> $dataThree

Index

Maintenant, vous pouvez voir pourquoi j’ai choisi les valeurs que j’ai fait pour cet exemple. J’ai présenté cela comme une offsetbecause qu’est ce qu’il est vraiment, mais ce décalage est plus communément appelé un index. Anindex qui commence à 0. Pour le reste de cet article, j’appellerai le décalage un index.

indice Spécial astuces

Dans la plupart des langues, vous ne pouvez spécifier qu’un seul numéro de l’index et vous obtenez un seul élément.PowerShell est beaucoup plus souple. Vous pouvez utiliser plusieurs index à la fois., En fournissant une liste desindexes, nous pouvons sélectionner plusieurs éléments.

PS> $dataZeroTwoThree

Les articles sont retournés dans l’ordre des indices fournis. Si vous dupliquez un index, vous obtenez cet élément les deux fois.

PS> $dataThreeZeroThree

Nous pouvons spécifier une séquence de nombres, grâce à la balise .. opérateur.

PS> $dataOneTwoThree

Cela fonctionne dans le sens inverse aussi.

PS> $dataThreeTwoOne

Vous pouvez utiliser des valeurs d’index négatives pour compenser la fin. Donc, si vous avez besoin du dernier élément de la liste,vous pouvez utiliser -1.,

PS> $dataThree

hors limites

dans la plupart des langues, si vous essayez d’accéder à un index d’un élément qui est passé la fin du tableau, vousdevrait obtenir un type d’erreur ou une exception. PowerShell ne renvoie rien silencieusement.

PS> $null -eq $dataTrue

Ne peut pas indexer dans un null, array

Si votre variable est $null et vous essayez de l’indexer comme un tableau, vous obtenez unSystem.Management.Automation.RuntimeException exception avec le messageCannot index into a null array.,

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

assurez-vous donc que vos tableaux ne sont pas$null avant d’essayer d’accéder aux éléments qu’ils contiennent.

Count

les Tableaux et d’autres collections ont un nombre biens que vous indique le nombre d’éléments dans le tableau.

PS> $data.count4

PowerShell 3.0 a ajouté une propriété count à la plupart des objets. vous pouvez avoir un seul objet et il devrait vous donner un nombre de 1.

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

Même $null a une propriété count sauf qu’il retourne 0.,

PS> $null.count0

Il y a quelques pièges ici que je vais revoir lorsque je couvre la vérification de$null ou des tableaux vides dans cet article.

off-by-one errors

Une erreur de programmation courante est créée car les tableaux commencent à l’index 0. Les erreurs Off-by-one peuvent êtreintroduit de deux manières.

la première consiste à penser mentalement que vous voulez le deuxième élément et à utiliser un index de 2 et à vraiment obtenir le troisième élément. Ou en pensant que vous avez quatre éléments et que vous voulez le dernier élément, vous utilisez donc le compte pour accéder au dernier élément.,

$data

PowerShell est parfaitement heureux de vous permettre de le faire et de vous donner exactement ce que l’élément à l’indice 4:$null. Vous devriez utiliser $data.count - 1 ou le -1 que nous avons appris ci-dessus.

PS> $dataThree

C’est là que vous pouvez utiliser la balise -1 index pour obtenir le dernier élément.

PS> $dataThree

Lee Dailey m’a également fait remarquer que nous pouvons utiliser$data.GetUpperBound(0) pour obtenir le numéro d’index maximum.,

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

la deuxième façon la plus courante consiste à itérer la liste et à ne pas s’arrêter au bon moment. Je vais le visiter lorsque nous parlerons de l’utilisation de la boucle for.

mise à jour des éléments

Nous pouvons utiliser le même index pour mettre à jour les éléments existants dans le tableau. Cela nous donne un accès direct àpdate éléments individuels.

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

Si nous essayons de mettre à jour un élément qui est passé le dernier élément, alors nous obtenons unIndex was outside the bounds of the array. erreur.

je reviendrai plus tard quand je parlerai de la façon de faire un tableau plus grand.,

itération

à un moment donné, vous devrez peut-être parcourir ou parcourir la liste entière et effectuer une action pour chaque élément du tableau.

Pipeline

Les Tableaux et le pipeline PowerShell sont destinés l’un à l’autre. C’est l’un des moyens les plus simples deprocessus sur ces valeurs. Lorsque vous passez un tableau à un pipeline, chaque élément à l’intérieur du tableau est traité individuellement.

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

Si vous n’avez pas vu $PSItem avant, il suffit de savoir que c’est la même chose que $_., Vous pouvez utiliser eitherone car ils représentent tous deux l’objet en cours dans le pipeline.

boucle ForEach

Le ForEach boucle fonctionne bien avec les collections. À l’aide de la syntaxe suivante:foreach ( <variable> in <collection> )

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

ForEach méthode

j’ai tendance à l’oublier, mais elle fonctionne bien pour les opérations simples. PowerShell vous permet d’appeler .ForEach() sur une collection.

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

Le .foreach() prend un paramètre qui est un bloc de script., Vous pouvez supprimer les parenthèses et justeprovide le bloc de script.

$data.foreach{"Item "}

Il s’agit d’une syntaxe moins connue mais qui fonctionne de la même manière. Cette foreach méthode a été ajoutée inPowerShell 4.0.

pour la boucle

la bouclefor est fortement utilisée dans la plupart des autres langues mais vous ne la voyez pas beaucoup dans PowerShell. Quand vous le voyez, c’est souvent dans le contexte de la marche d’un tableau.

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

La première chose à faire est d’initialiser un $index de 0., Ensuite, nous ajoutons la condition que le $index doit être inférieure à $data.count. Enfin, nous spécifions que chaque fois que nous bouclons que je dois augmenter theindex par 1. Dans ce cas, $index++ est l’abréviation de $index = $index + 1.

chaque fois que vous utilisez une bouclefor, portez une attention particulière à la condition. J’ai utilisé$index -lt $data.count ici. Il est facile d’obtenir la condition légèrement fausse pour obtenir une erreur off-by-oneerror dans votre logique., À l’aide de $index -le $data.count ou $index -lt ($data.count - 1) sont jamais soslightly mal. Cela entraînerait votre résultat à traiter trop ou trop peu d’éléments. C’est l’erreur classique off-by-one.

boucle de commutation

c’est une boucle facile à ignorer. Si vous fournissez un tableau à une instruction switch, itchecks chaque élément du tableau.

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

Il y a beaucoup de choses cool que l’on peut faire avec l’instruction switch. J’ai une autre articlededicated à cela.,

  • Tout ce que vous avez toujours voulu savoir sur l’instruction switch

mise à jour des valeurs

lorsque votre tableau est une collection de chaînes ou d’entiers (types de valeurs), vous pouvez parfois mettre à jour les valeurs du tableau lorsque vous les parcourez. La plupart des boucles ci-dessus utilisent une variable dans theloop qui contient une copie de la valeur. Si vous mettez à jour cette variable, la valeur d’origine dans le tableau n’est pas mise à jour.

l’exception à cette instruction est la bouclefor., Si vous voulez parcourir un tableau et mettre à jour les valeursà l’intérieur, alors la boucle for est ce que vous recherchez.

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

Cet exemple prend une valeur par index, fait quelques modifications, puis utilise ce même indice à assignit dos.

tableaux d’objets

Jusqu’à présent, la seule chose que nous avons placée dans un tableau est un type de valeur, mais les tableaux peuvent également contenir des objets.

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

de nombreuses applets de commande renvoient des collections d’objets sous forme de tableaux lorsque vous les affectez à une variable.,

$processList = Get-Process

toutes les fonctionnalités de base dont nous avons déjà parlé s’appliquent toujours aux tableaux d’objets avec quelques détails à souligner.

accès aux propriétés

Nous pouvons utiliser un index pour accéder à un élément individuel dans une collection tout comme avec les types de valeur.

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

Nous pouvons accéder et mettre à jour les propriétés directement.,

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

Propriétés du tableau

normalement, vous devez énumérer la liste entière comme ceci pour accéder à toutes les propriétés:

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

ou en utilisant l’applet de commandeSelect-Object -ExpandProperty.

PS> $data | Select-Object -ExpandProperty LastNameMarquetteDoe

Mais PowerShell nous offre la possibilité de demander LastName directement. PowerShell énumère themall pour nous et renvoie une liste propre.

PS> $data.LastNameMarquetteDoe

l’énumération se produit toujours mais nous ne voyons pas la complexité derrière elle.,

Where-Object filtering

c’est là queWhere-Object entre en jeu afin que nous puissions filtrer et sélectionner ce que nous voulons dans le tableau en fonction des propriétés de l’objet.

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

On peut écrire la même requête pour obtenir le FirstName nous sommes à la recherche pour.

$data | Where FirstName -eq Kevin

Où()

les Tableaux ont un Where() méthode qui vous permet de spécifier une balise scriptblock pour le filtre.

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

Cette fonctionnalité a été ajoutée dans PowerShell 4.0.,

mise à jour des objets dans les boucles

avec les types de valeur, la seule façon de mettre à jour le tableau est d’utiliser une boucle for car nous devons connaître leindex pour remplacer la valeur. Nous avons plus d’options avec les objets car ce sont des types de référence. Voici un exemple rapide:

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

Cette boucle parcourt chaque objet du tableau$data. Étant donné que les objets sont des types de référence, la variable$person référence exactement le même objet qui se trouve dans le tableau. Donc, les mises à jour de itsproperties mettent à jour l’original.,

Vous ne pouvez toujours pas remplacer l’objet entier de cette façon. Si vous essayez d’affecter un nouvel objet à la variable$person, vous mettez à jour la référence de variable vers autre chose qui ne pointe plus vers l’objet d’origine dans le tableau. Cela ne fonctionne pas comme prévu:

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

opérateurs

Les opérateurs de PowerShell fonctionnent également sur des tableaux. Certains d’entre eux fonctionnent légèrement différemment.

-join

Le -join opérateur est le plus évident alors, regardons d’abord., J’aime l’opérateur-joinet l’utilise souvent. Il joint tous les éléments du tableau avec le caractère ou la chaîne quivous spécifiez.

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

l’Une des caractéristiques que j’aime à propos de la balise -join opérateur est qu’il gère les éléments simples.

PS> 1 -join '-'1

j’utilise cela dans la journalisation et les messages verbeux.

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

-join array array

Voici une astuce astucieuse que Lee Dailey m’a montrée., Si jamais vous voulez tout joindre sans délimiteur, au lieu de le faire:

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

Vous pouvez utiliser -join avec le tableau comme paramètre sans préfixe. Jetez un oeil à cet exemple tosee dont je parle.

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

-remplacer et -split

Les autres opérateurs comme -replace et -split exécuter sur chaque élément d’un tableau. Je ne peux pas dire que je les ai déjà utilisés de cette façon, Mais voici un exemple.,

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

-contient

Le -contains opérateur permet de vérifier un tableau de valeurs pour voir si elle contient un specifiedvalue.

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

en

si vous avez une valeur unique que vous souhaitez vérifier correspond à l’un de plusieurs valeurs, vous pouvez utiliser la balise -in opérateur. La valeur serait à gauche et le tableau à droite de theoperator.

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

Cela peut coûter cher si la liste est grande. J’utilise souvent un modèle regex si je vérifie plus de quelques valeurs.,

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

-eq et -ne

l’Égalité et les tableaux peuvent se compliquer. Lorsque le tableau est sur le côté gauche, chaque élément est comparé. Au lieu de renvoyer True, il renvoie l’objet qui correspond.

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

lorsque vous utilisez l’opérateur-ne, nous obtenons toutes les valeurs qui ne sont pas égales à notre valeur.

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

Lorsque vous utilisez cette option dans une if() déclaration, la valeur renvoyée est un True valeur., Si aucune valeur n’est renvoyée, alors c’est une valeur False. Ces deux instructions suivantes sont évaluées à True.

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

je vais revenir sur ce point dans un moment où nous parlons de tester pour$null.

match

Le -match opérateur essaie de faire correspondre à chaque élément de la collection.

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

Lorsque vous utilisez la balise -match avec une seule valeur, une variable spéciale $Matches est renseigné avec matchinfo., Ce n’est pas le cas lorsqu’un tableau est traité de cette façon.

nous pouvons adopter la même approche avecSelect-String.

$servers | Select-String SQL

j’ai regarder de plus près Select-String,-match et le $matches variable dans un autre post calledThe de nombreuses façons d’utiliser les regex.

$null ou vide

de Test de $null ou des tableaux vides peut être délicat. Voici les pièges courants avec des tableaux.

en un coup d’œil, cette déclaration semble fonctionner.,

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

Mais je suis juste allé sur la façon dont -eq vérifie chaque élément du tableau. Donc on peut avoir un tableau de severalitems avec un seul $valeur null et il serait d’évaluer la $true

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

C’est pourquoi il est recommandé de placer la balise $null sur le côté gauche de l’opérateur. Cela rend ce scénario un non-problème.

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

$null array n’est pas la même chose comme un tableau vide. Si vous savez que vous avez un tableau, vérifiez le nombre d’objets qu’il contient., Si le tableau est de $null, le nombre est 0.

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

Il y a un piège, à regarder ici. Vous pouvez utiliser le count même si vous avez un singleobject, sauf si cet objet est un PSCustomObject. C’est un bug qui est corrigé dans PowerShell 6.1.C’est une bonne nouvelle, mais beaucoup de gens sont toujours sur 5.1 et doivent faire attention.

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

Si vous êtes toujours sur PowerShell 5.1, vous pouvez envelopper l’objet dans un tableau avant de vérifier le nombre pour obtenir un nombre précis.,

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

Pour pleinement jouer la sécurité, vérifier $null, puis vérifier le décompte.

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

Tous -eq

j’ai récemment vu quelqu’un demander comment vérifier que toutes les valeurs dans un tableau correspond à une valeur donnée.Reddit user / u / bis avait cette solution intelligente qui vérifie toutes les valeurs incorrectes et thenflips le résultat.

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

Ajouter à des tableaux

À ce stade, vous commencez à vous demander comment ajouter des éléments à un tableau. La réponse rapide est que vous ne pouvez pas. un tableau est une taille fixe en mémoire., Si vous avez besoin de le développer ou d’y ajouter un seul élément, alorsvous devez créer un nouveau tableau et copier toutes les valeurs de l’ancien tableau. Cela ressemble à beaucoup de travail, cependant, PowerShell cache la complexité de la création du nouveau tableau. PowerShellimplements l’opérateur d’addition (+) pour les tableaux.

Remarque

PowerShell n’implémente pas d’opération de soustraction. Si vous voulez une alternative souple à anarray, vous devez utiliser un générique List objet.,

Array plus

On peut utiliser l’opérateur d’addition avec les tableaux pour créer un nouveau tableau. Donc, étant donné ces deux tableaux:

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

Nous pouvons les ajouter ensemble pour obtenir un nouveau tableau.

PS> $first + $secondZeroOneTwoThree

plus equals +=

Nous pouvons créer un nouveau tableau en place et y ajouter un élément comme ceci:

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

rappelez-vous simplement que chaque fois que vous utilisez += que vous tableau. Ce n’est pas un problème pour les petits ensembles de données, mais il évolue extrêmement mal.,

affectation de Pipeline

Vous pouvez affecter les résultats de n’importe quel pipeline dans une variable. C’est un tableau s’il contient multipleitems.

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

normalement, lorsque nous pensons à utiliser le pipeline, nous pensons aux one-liners PowerShell typiques. Nous canlever le pipeline avec foreach() instructions et autres boucles. Ainsi, au lieu d’ajouter des éléments à anarray dans une boucle, nous pouvons déposer des éléments sur le pipeline.

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

types de tableaux

par défaut, un tableau dans PowerShell est créé en tant que type]., Cela lui permet de contenirtout type d’objet ou de valeur. Cela fonctionne car tout est hérité du type PSObject.

Fortement typé tableaux

Vous pouvez créer un tableau de n’importe quel type en utilisant une syntaxe similaire. Lorsque vous créez un tableau fortement typé,il ne peut contenir que des valeurs ou des objets du type spécifié.

ArrayList

ajouter des éléments à un tableau est l’une de ses plus grandes limitations, mais il existe quelques autres collections vers lesquelles nous pouvons nous tourner pour résoudre ce problème.,

LeArrayList est généralement l’une des premières choses auxquelles nous pensons lorsque nous avons besoin d’un tableau plus rapide à utiliser. Il agit comme un tableau d’objets à chaque endroit où nous en avons besoin, mais il gère les éléments d’ajout rapidement.

Voici comment nous créer un ArrayList et l’ajout d’éléments.

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

Nous appelons dans.Net pour obtenir ce type. Dans ce cas, nous utilisons le constructeur par défaut pour le créer. Ensuite, nous appelons la méthodeAdd pour y ajouter un élément.,

la raison pour laquelle j’utilise au début de la ligne est de supprimer le code de retour. Some.NET les appels le font et peuvent créer une sortie inattendue.

Si les seules données que vous avez dans votre tableau sont des chaînes, jetez également un œil à usingStringBuilder. C’est presque la même chose mais a quelques méthodes qui sont juste pour traiter withstrings. Le StringBuilder est spécialement conçu pour les performances.

il est courant de voir des personnes passer àArrayList à partir de tableaux. Mais cela vient d’une époque où C# n’avait pas de support Générique., Le ArrayList est obsolète dans la prise en charge du générique List

liste générique

un type générique est un type spécial en C# qui définit une classe généralisée et l’utilisateur spécifie les types de données qu’il utilise lors de sa création. Donc, si vous voulez une liste de nombres ou de chaînes de caractères, vous definethat vous voulez la liste des int ou string types.

Voici comment créer une liste pour les chaînes.

$mylist = ]::new()

Ou une liste de nombres.,

$mylist = ]::new()

Nous pouvons convertir un tableau existant en une liste comme celle-ci sans créer d’abord l’objet:

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

Nous pouvons raccourcir la syntaxe avec l’instructionusing namespace dans PowerShell 5 et plus récent. L’instructionusing doit être la première ligne de votre script. En déclarant un espace de noms, PowerShelllets vous le laissez hors des types de données lorsque vous les référencez.

using namespace System.Collections.Generic$myList = ]@(1,2,3)

Cela fait de la balise List beaucoup plus utilisable.,

Vous avez une méthode similaireAdd à votre disposition. Contrairement à ArrayList, il n’y a pas de valeur de retour sur la méthode Add donc nous n’avons pas à void.

$myList.Add(10)

et nous pouvons toujours accéder aux éléments comme d’autres tableaux.

PS> $myList10

Liste

Vous pouvez avoir une liste de tout type, mais quand vous ne connaissez pas le type des objets, vous pouvez utiliser] pour les contenir.,

$list = ]::new()

Remove()

Le ArrayList et le générique List à la fois le soutien de la suppression d’éléments de la collection.

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

lorsque vous travaillez avec des types de VALEURs, il supprime le premier de la liste. Vous pouvez l’appeler à nouveau pour continuer à supprimer cette valeur. Si vous avez des types de référence, vous devez fournir l’objectthat que vous souhaitez supprimer.,

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

La méthode remove retourne true s’il a été en mesure de trouver et de supprimer l’élément de la collection.

Plus de collections

Il existe de nombreuses autres collections qui peuvent être utilisés, mais ce sont les bons génériques tableau de remplacement.Si vous souhaitez en savoir plus sur ces options, jetez un oeil à thisGist thatMark Kraus mis en place.

Autres nuances

Maintenant que j’ai couvert toutes les grandes fonctionnalités, voici quelques autres choses que je voulais tomention avant de me résumer.,

tableaux pré-dimensionnés

j’ai mentionné que vous ne pouvez pas changer la taille d’un tableau une fois qu’il est créé. Nous pouvons créer un tableau d’une taille prédéterminée en l’appelant avec le constructeurnew($size).

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

multiplier les tableaux

Une petite astuce intéressante est que vous pouvez multiplier un tableau par un entier.

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

Initialiser à 0

Un scénario commun, c’est que vous souhaitez créer un tableau avec tous les zéros. Si vous n’avez que des integers, un tableau d’entiers fortement typés vaut par défaut tous les zéros.,

PS> ]::new(4)0000

Nous pouvons également utiliser l’astuce de multiplication pour le faire.

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

la bonne chose à propos de l’astuce de multiplication est que vous pouvez utiliser n’importe quelle valeur. Donc, si vous préférez avoir 255 comme valeur par défaut, ce serait un bon moyen de le faire.

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

les tableaux Imbriqués

Un tableau à l’intérieur du tableau est appelé un tableau imbriqué. Je ne les utilise pas beaucoup dans PowerShell mais je les ai utilisés davantage dans d’autres langues. Envisagez d’utiliser un tableau de tableaux lorsque vos données s’inscrivent dans un modèle de grille.,

Voici deux façons de créer un tableau bidimensionnel.

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

La virgule est très important dans ces exemples. J’ai donné un exemple précédent d’un tableau normal sur plusieurs lignes où la virgule était facultative. Ce n’est pas le cas avec un tableau multidimensionnel.

la façon dont nous utilisons la notation d’index change légèrement maintenant que nous avons un tableau imbriqué. En utilisant le$data ci-dessus, voici comment nous pourrions accéder à la valeur 3.

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

ajoutez un jeu de crochets pour chaque niveau d’imbrication du tableau., Le premier ensemble de crochets est pour le tableau le plus externe, puis vous vous frayez un chemin à partir de là.

Write-Output-NoEnumerate

PowerShell aime déballer ou énumérer des tableaux. C’est un aspect fondamental de la façon dont PowerShell utilise thepipeline, mais il y a des moments où vous ne voulez pas que cela se produise.

je pipe généralement des objets versGet-Member pour en savoir plus à leur sujet. Lorsque j’y conduis un tableau, il est déballé et Get-Member voit les membres du tableau et non le tableau réel.,

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

Pour éviter que de déballer le tableau, vous pouvez utiliser Write-Object -NoEnumerate.

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

j’ai un deuxième qui est plus d’un hack (et j’essaie d’éviter les bidouilles de ce genre). Vous pouvez placer acomma devant le tableau avant de vous diriger.

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

renvoie un tableau

ce déballage des tableaux se produit également lorsque vous affichez ou renvoyez des valeurs d’une fonction. Vous pouvez toujours obtenir un tableau si vous affectez la sortie à une variable, ce n’est donc pas souvent un problème.

le problème est que vous avez un nouveau tableau., Si c’est jamais un problème, vous pouvez utiliserWrite-Output -NoEnumerate $array ou return ,$array pour le contourner.

autre Chose?