Powershell与管道中的可用数据

时间:2013-02-20 02:21:51

标签: powershell powershell-v3.0

我很困惑。我无法理解为什么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在这做什么?

1 个答案:

答案 0 :(得分:3)

PowerShell管道将“展开”数组和集合(一个级别),但不会散列表。如果要在PowerShell中枚举哈希表的键值对,请调用.getenumerator()方法:

$ht = @{a=1;b=2}
$ht.GetEnumerator()



Name                           Value                                                             
----                           -----                                                             
a                              1                                                                 
b                              2