У меня есть способ делать массивы в других языках, например:
$x = "David"
$arr = @()
$arr[$x]["TSHIRTS"]["SIZE"] = "M"
Это приводит к ошибке.
У меня есть способ делать массивы в других языках, например:
$x = "David"
$arr = @()
$arr[$x]["TSHIRTS"]["SIZE"] = "M"
Это приводит к ошибке.
Вы пытаетесь создать ассоциативный массив (хеш). Попробуйте следующее последовательность команд
[email protected]{}
$arr["david"] = @{}
$arr["david"]["TSHIRTS"] = @{}
$arr["david"]["TSHIRTS"]["SIZE"] ="M"
$arr.david.tshirts.size
Обратите внимание на разницу между хэшами и массивами
$a = @{} # hash
$a = @() # array
Массивы могут содержать только неотрицательные целые числа в качестве индексов
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
Чтобы распространить на то, что, упомянутые выше, означает, что вы можете вложить Hashtables. Это может быть не истинный многомерный массив, а дать вам некоторые идеи о том, как структурировать данные. Пример:
$hash = @{}
$computers | %{
$hash.Add(($_.Name),(@{
"Status" = ($_.Status)
"Date" = ($_.Date)
}))
}
Что круто об этом, так это то, что вы можете ссылаться на такие вещи, как:
($hash."Name1").Status
Кроме того, он намного быстрее, чем массив для поиска вещей. Я использую это, чтобы сравнивать данные, а не использовать сопоставление в массивах.
$hash.ContainsKey("Name1")
Надеюсь, что это помогает!
-Adam
Зная, что 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
Вы также можете использовать 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]
иначе скрипт разозлится.
Вот простой многомерный массив строк.
$psarray = @(
('Line' ,'One' ),
('Line' ,'Two')
)
foreach($item in $psarray)
{
$item[0]
$item[1]
}
Выход:
Line
One
Line
Two
Использование синтаксиса .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