web-dev-qa-db-fra.com

Tableaux multidimensionnels Powershell

J'ai une façon de faire des tableaux dans d'autres langues comme celle-ci:

$x = "David"
$arr = @()

$arr[$x]["TSHIRTS"]["SIZE"] = "M"

Cela génère une erreur.

30
Karl Morrison

Vous essayez de créer un tableau associatif (hachage). Essayez la séquence de commandes suivante

$arr=@{}
$arr["david"] = @{}
$arr["david"]["TSHIRTS"] = @{}    
$arr["david"]["TSHIRTS"]["SIZE"] ="M"
$arr.david.tshirts.size

Notez la différence entre les hachages et les tableaux

$a = @{} # hash
$a = @() # array

Les tableaux ne peuvent avoir que des entiers non négatifs comme index

46
manojlds

de powershell.com:

PowerShell prend en charge deux types de tableaux multidimensionnels: les tableaux déchiquetés et les vrais tableaux multidimensionnels.

Les tableaux dentelés sont des tableaux PowerShell normaux qui stockent des tableaux en tant qu'éléments. Ce stockage est très rentable car les dimensions peuvent être de taille différente:

$array1 = 1,2,(1,2,3),3
$array1[0]
$array1[1]
$array1[2]
$array1[2][0]
$array1[2][1]

Les véritables tableaux multidimensionnels ressemblent toujours à une matrice carrée. Pour créer un tel tableau, vous devez accéder à .NET. La ligne suivante crée un tableau à deux dimensions avec 10 et 20 éléments ressemblant à une matrice 10x20:

$array2 = New-Object 'object[,]' 10,20
$array2[4,8] = 'Hello'
$array2[9,16] = 'Test'
$array2

pour un réseau 3-dimensioanl 10 * 20 * 10

$array3 = New-Object 'object[,,]' 10,20,10
22
CB.

Pour continuer sur ce que, manojlds, dit ci-dessus est que vous pouvez imbriquer Hashtables. Ce n'est peut-être pas un véritable tableau multidimensionnel, mais vous donne quelques idées sur la manière de structurer les données. Un exemple:

$hash = @{}

$computers | %{
    $hash.Add(($_.Name),(@{
        "Status" = ($_.Status)
        "Date"   = ($_.Date)
    }))
}

Ce qui est cool à propos de ça, c'est que vous pouvez référencer des choses comme:

($hash."Name1").Status

En outre, il est beaucoup plus rapide que le tableau pour trouver des choses. J'utilise ceci pour comparer des données plutôt que d'utiliser l'appariement dans les tableaux.

$hash.ContainsKey("Name1")

J'espère que cela aide!

-Adam

14
alistek

Sachant que PowerShell dirige des objets entre des applets de commande , il est plus courant d'utiliser un tableau de PSCustomObjects:

$arr = @(
    New-Object PSObject -Property @{Name = "David";  Article = "TShirt"; Size = "M"}
    New-Object PSObject -Property @{Name = "Eduard"; Article = "Trouwsers"; Size = "S"}
)

Ou pour les versions 3 et supérieures de PowerShell:

$arr = @(
    [PSCustomObject]@{Name = "David";  Article = "TShirt"; Size = "M"}
    [PSCustomObject]@{Name = "Eduard"; Article = "Trouwsers"; Size = "S"}
)

Et grep votre sélection comme:

$arr | Where {$_.Name -eq "David" -and $_.Article -eq "TShirt"} | Select Size
5
iRon

Voici un tableau multidimensionnel simple de chaînes.

$psarray = @(
 ('Line' ,'One' ),
 ('Line' ,'Two')
)

foreach($item in $psarray)
{
    $item[0]
    $item[1]
}

Sortie:

Line
One
Line
Two
0
Xavier John

vous pouvez également utiliser System.Collections.ArrayList pour créer un tableau de tableaux ou celui que vous souhaitiez ..

$resultsArray= New-Object System.Collections.ArrayList 
[void] $resultsArray.Add(@(@('$hello'),2,0,0,0,0,0,0,1,1))
[void] $resultsArray.Add(@(@('$test', '$testagain'),3,0,0,1,0,0,0,1,2))
[void] $resultsArray.Add("ERROR")
[void] $resultsArray.Add(@(@('$var', '$result'),5,1,1,0,1,1,0,2,3))
[void] $resultsArray.Add(@(@('$num', '$number'),3,0,0,0,0,0,1,1,2))

Un problème, si vous appelez cela un problème, vous ne pouvez pas définir de limite. En outre, vous devez utiliser [void] ou le script deviendra fou.

0
Franco Pettigrosso