我有PSObjects
的这个列表,每个列表都包含Hashtable
。目前我可以这样解决:
foreach ($item in $myListOfItems) { $item.Metadata["Title"] }
但是,我想知道我是否可以用滚边和Select
来做某事。这可能吗?例如:
$myListOfItems | Select $_.Metadata["Title"]
......只输出一大堆空白行:(
有什么想法吗?非常感谢提前!
答案 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"]
→$null
。 Select-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;)术语可以更好地描述正在发生的事情,但毕竟“其他任何名称的玫瑰”。