Обработка многомерных массивов в Powershell довольно паршивая, и я стараюсь не использовать их при любой возможности. Ответ Джавада в комментариях о создании массива HashTables - это один из способов избежать их использования, но он не использует преимущества объектно-ориентированной природы PowerShell. В качестве примера я хочу передать информацию о 3 компьютерах, их именах, размере HD и объеме памяти. Используя решение HashTable, вы получаете:
$Array = @()
$Array += @{Computer='star';HD='2TB';Memory='16GB'}
$Array += @{Computer='comet';HD='1TB';Memory='8GB'}
$Array += @{Computer='meteor';HD='3TB';Memory='16GB'}
Этот массив содержит 3 элемента:
PS> $Array.Count
3
И вы можете получить доступ к данным так, как вы ожидаете:
PS> $Array[1]['Computer']
comet
Но вы также можете обращаться к нему как к свойству.
PS> $Array[1].Computer
comet
Но, когда вы перечисляете содержимое, данные смешиваются, и их нелегко понять:
PS> $Array
Name Value
---- -----
Memory 16GB
HD 2TB
Computer star
Memory 8GB
HD 1TB
Computer comet
Memory 16GB
HD 3TB
Computer meteor
И кроме того, «поля», которые вы создали, не являются свойствами объекта, а являются элементами массива ключей, и их сложнее перебирать, чем нужно.
PS C:\Users\Matthew> $Array[0] | gm
TypeName: System.Collections.Hashtable
Name MemberType Definition
---- ---------- ----------
Add Method void Add(System.Object key, System.Object value), void IDictionary.Add(System.Object key, S...
Clear Method void Clear(), void IDictionary.Clear()
Clone Method System.Object Clone(), System.Object ICloneable.Clone()
Contains Method bool Contains(System.Object key), bool IDictionary.Contains(System.Object key)
ContainsKey Method bool ContainsKey(System.Object key)
ContainsValue Method bool ContainsValue(System.Object value)
CopyTo Method void CopyTo(array array, int arrayIndex), void ICollection.CopyTo(array array, int index)
Equals Method bool Equals(System.Object obj)
GetEnumerator Method System.Collections.IDictionaryEnumerator GetEnumerator(), System.Collections.IDictionaryEnu...
GetHashCode Method int GetHashCode()
GetObjectData Method void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Seri...
GetType Method type GetType()
OnDeserialization Method void OnDeserialization(System.Object sender), void IDeserializationCallback.OnDeserializati...
Remove Method void Remove(System.Object key), void IDictionary.Remove(System.Object key)
ToString Method string ToString()
Item ParameterizedProperty System.Object Item(System.Object key) {get;set;}
Count Property int Count {get;}
IsFixedSize Property bool IsFixedSize {get;}
IsReadOnly Property bool IsReadOnly {get;}
IsSynchronized Property bool IsSynchronized {get;}
Keys Property System.Collections.ICollection Keys {get;}
SyncRoot Property System.Object SyncRoot {get;}
Values Property System.Collections.ICollection Values {get;}
Однако, если вы должны были воспользоваться преимуществами объектной природы PowerShell и вместо HashTables использовать пользовательский объект PowerShell (тип [PSCustomObject]), который резко меняется. Вы можете создать новый объект разными способами, но вы можете проверить этот Te chNet Article PowerShell: Создание пользовательских объектов для нескольких из них. Я собираюсь использовать мой личный фаворит, который очень похож на метод HashTable, так как он использует HashTable для определения параметров объекта:
$Array = @()
$Array += [PSCustomObject]@{Computer='star';HD='2TB';Memory='16GB'}
$Array += [PSCustomObject]@{Computer='comet';HD='1TB';Memory='8GB'}
$Array += [PSCustomObject]@{Computer='meteor';HD='3TB';Memory='16GB'}
Это дает вам те же 3 элемента в массиве:
PS> $Array.Count
3
Поскольку данные не в формате HashTable, вы не можете обращаться к ним как к HashTable, но вы можете обращаться к ним как к свойству:
PS> $Array[1]['Computer']
PS> $Array[1].Computer
comet
Но что вы получаете является то, что данные хранятся отдельно в отдельных объектах:
PS> $Array
Computer HD Memory
-------- -- ------
star 2TB 16GB
comet 1TB 8GB
meteor 3TB 16GB
И определение объекта красиво и аккуратно:
PS> $Array[0] | gm
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Computer NoteProperty string Computer=star
HD NoteProperty string HD=2TB
Memory NoteProperty string Memory=16GB
Я надеюсь, что это поможет вам лучше понять, как PowerShell обрабатывает данные и помогает вам сделать правильный выбор, как хранить ваши данные.