从PowerShell散列表中选择项目而不使用Foreach

时间:2014-12-09 06:58:43

标签: powershell

我有PSObjects的这个列表,每个列表都包含Hashtable。目前我可以这样解决:

foreach ($item in $myListOfItems) { $item.Metadata["Title"] }

但是,我想知道我是否可以用滚边和Select来做某事。这可能吗?例如:

$myListOfItems | Select $_.Metadata["Title"] ......只输出一大堆空白行:(

有什么想法吗?非常感谢提前!

2 个答案:

答案 0 :(得分:2)

怎么样?
$myListOfItems | select @{ Label="Title";Expression={$_.Metadata["Title"]}}    

答案 1 :(得分:0)

最初的想法是关闭,但语法错误。要使用$_,表达式必须在脚本块参数(Powershell V3 +)中:

 $myListOfItems | select { $_.Metadata["title"] }

在没有封闭的脚本块的情况下,$_是在整个管道而不是管道元素(在这种情况下为Select-Object)的上下文中求值的。在此级别上,$_未定义,因此求值为$null。 PowerShell有点不恰当地使用$null。特别是,尝试检索$null的属性不是错误,它仅返回$null。因此,$null.Metadata["title"]$null["title"]$nullSelect-Object $null只会为每个输入对象输出一个空的选择对象,从而导致空白行。

应注意,严格来说,最初建议的Select-Object(固定)或答案中的哈希表版本都没有提供与ForEach循环相同的输出。循环从.Metadata [“ Title”]成员产生一个值序列,而Select-Object产生一个选择对象[Selected.System.Collections.Hashtable]的序列,每个选择对象包含一个成员(名为$ _。Metadata [“ Title”]和标题)分别保存值。是否引起问题取决于用法。

要获取简短版本,请尝试:

$myListOfItems.Metadata.Title

自PowerShell V3起,指定集合的​​不存在成员会导致Powershell执行成员枚举 ,从而枚举集合并返回值序列集合中每个元素的指定成员的数量(假设有一个)。如果我们假设从左到右求值,则表达式的求值为:

($myListOfItems.Metadata).Title

首先枚举项目集合,因为它没有元数据成员。每个项目确实都有一个元数据成员,因此会产生Array个元数据成员。然后枚举没有Title成员的元数据哈希表集合,以产生Array哈希表的Title元素。

†我认为成员枚举一词有些误导。不是枚举成员,而是随后创建集合中的对象以及每个对象的指定成员的Array。确实,即使手册about_Hash_Tables声明哈希表具有以具有相应值的键命名的属性,但实际上这仅仅是Powershell调用索引器[]的简写(实际上似乎覆盖了成员访问权限,因此当您要访问具有这些名称的 actual 哈希表成员时,请提防具有键“ Count”,“ Keys”,“ Values”,...的哈希表)。因此,严格来说,没有“ Title”成员。 “枚举集合成员访问权限”(ECMA;)术语可以更好地描述正在发生的事情,但毕竟“其他任何名称的玫瑰”。