Хеш-таблица Powershell, хранящая значения "System.Collections.DictionaryEntry"

Когда я выполняю команду:

$var = @{a=1;b=2}

в Powershell (версия 3), $var заканчивается значением {System.Collections.DictionaryEntry, System.Collections.DictionaryEntry}, Почему это происходит? Как я могу сохранить значения, которые я хочу сохранить?

1 ответ

Это потому, что ваш ISE перечисляет коллекцию для создания дерева переменных, а объекты возвращаются из HashtableEnumerator который вы получаете от $var.GetEnumerator() являются DictionaryEntry-объекты.

$var = @{a=1;b=2}

#Collection is a Hashtable
$var | Get-Member -MemberType Properties    

   TypeName: System.Collections.Hashtable

Name           MemberType Definition
----           ---------- ----------
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;}

#Enumerated objects (is that a word?) are DictionaryEntry(-ies)
$var.GetEnumerator() | Get-Member -MemberType Properties

   TypeName: System.Collections.DictionaryEntry

Name  MemberType    Definition
----  ----------    ----------
Name  AliasProperty Name = Key
Key   Property      System.Object Key {get;set;}  
Value Property      System.Object Value {get;set;}

Ваше значение (1 и 2) хранится в Value-собственность на объекты в то время как они Key это идентификатор, который вы использовали (а и б).

Вы должны заботиться об этом, только когда вам нужно перечислить хеш-таблицу, напр. Когда вы просматриваете каждый элемент. Для обычного использования это закулисная магия, поэтому вы можете использовать $var["a"],

Другие вопросы по тегам