Многомерные массивы Powershell - PullRequest
35 голосов
/ 22 февраля 2012

У меня есть способ сделать массивы в других языках, как это:

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

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

Это приводит к ошибке.

Ответы [ 7 ]

49 голосов
/ 22 февраля 2012

Вы пытаетесь создать ассоциативный массив (хэш).Попробуйте следующую последовательность команд

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

Обратите внимание на разницу между хэшами и массивами

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

Массивы могут иметь только неотрицательные целые числа в качестве индексов

26 голосов
/ 22 февраля 2012

от powershell.com:

PowerShell поддерживает два типа многомерных массивов: неровные массивы и истинные многомерные массивы.

Неровные массивы - это обычные массивы PowerShell, которые хранят массивы в виде элементов.Это очень экономичное хранилище, потому что размеры могут быть разного размера:

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

Истинные многомерные массивы всегда напоминают квадратную матрицу.Для создания такого массива вам потребуется доступ к .NET.Следующая строка создает двумерный массив с 10 и 20 элементами, напоминающими матрицу 10x20:

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

для трехмерного массива 10 * 20 * 10

$array3 = New-Object 'object[,,]' 10,20,10
14 голосов
/ 23 февраля 2012

Если говорить о том, что, как сказал выше manojlds, вы можете вкладывать Hashtables. Возможно, это не настоящий многомерный массив, но он даст вам некоторые идеи о том, как структурировать данные. Пример:

$hash = @{}

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

Что в этом хорошего, так это то, что вы можете ссылаться на такие вещи, как:

($hash."Name1").Status

Кроме того, это намного быстрее, чем массив для поиска вещей. Я использую это для сравнения данных, а не для сопоставления в массивах.

$hash.ContainsKey("Name1")

Надеюсь, что это поможет!

-Adam

7 голосов
/ 10 августа 2017

Зная, что PowerShell передает объекты между командлетами , более распространенным является использование массива PSCustomObjects:

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

Или для PowerShell версии 3 и выше:

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

И grep ваш выбор как:

$arr | Where {$_.Name -eq "David" -and $_.Article -eq "TShirt"} | Select Size
0 голосов
/ 27 апреля 2019

Используя синтаксис .net (как указано выше в CB)
вы также добавляете когерентность в свой «табличный» массив ...

, если определяете массив ...
и пытаетесьдля хранения различных типов
Powershell «предупредит вас»:

$a = New-Object 'byte[,]' 4,4
$a[0,0] = 111;    // OK
$a[0,1] = 1111;   // Error

Конечно, Powershell «поможет» вам
в очевидных конверсиях:

$a = New-Object 'string[,]' 2,2
$a[0,0] = "1111";   // OK
$a[0,1] = 111;      // OK also
0 голосов
/ 08 февраля 2019

Вот простой многомерный массив строк.

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

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

Выход:

Line
One
Line
Two
0 голосов
/ 28 ноября 2018

вы также можете использовать System.Collections.ArrayList для создания массивов и массивов или чего угодно.Вот пример:

$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))

Одна проблема, если вы бы назвали ее проблемой, вы не можете установить ограничение.Также вам нужно использовать [void], иначе скрипт рассердится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...