Подтвердить что ты не робот

Многомерные массивы Powershell

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

from 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

для 3-мерной матрицы 10 * 20 * 10

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

Ответ 3

Чтобы распространить на то, что, упомянутые выше, означает, что вы можете вложить Hashtables. Это может быть не истинный многомерный массив, а дать вам некоторые идеи о том, как структурировать данные. Пример:

$hash = @{}

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

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

($hash."Name1").Status

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

$hash.ContainsKey("Name1")

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

-Adam

Ответ 4

Зная, что 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

Ответ 5

Вы также можете использовать 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] иначе скрипт разозлится.

Ответ 6

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

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

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

Выход:

Line
One
Line
Two

Ответ 7

Использование синтаксиса .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