我很困惑。我不明白为什么Powershell中的foreach的行为与C#如此不同。
这个简单的代码不产生任何输出:
@{a=1; b=2} | %{ $_.key }
我在Linqpad中使用C#进行了近似处理,得到了我期望的输出:
var ht = new Hashtable(); ht["a"] = 1; ht["b"] = 2; foreach (DictionaryEntry kvp in ht) { kvp.Key.Dump(); } // output a b
如果我枚举哈希表的Keys成员,我可以做我需要的事情。但我不明白为什么枚举哈希表本身不会返回键值对。事实上,它似乎返回了对象本身:
> @{a=1; b=2} | %{ $_.gettype() } IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Hashtable System.Object
Powershell在这里做什么?
PowerShell管道将“展开”数组和集合(一级),但不展开哈希表。如果要在PowerShell中枚举哈希表的键值对,请调用.getenumerator()方法:
$ht = @{a=1;b=2} $ht.GetEnumerator() Name Value ---- ----- a 1 b 2