在我看来,您的函数返回
[hashtable]
,但您使用它就像它是一个具有属性的对象一样。
这正好适合
Where-Object
因为
.Member
语法用于访问
[哈希表]
价值观,但它不适用于
Select-Object
因为它是在实际属性上运行的。
那么你能做什么呢?
如果你想把它作为
[哈希表]
,并坚持在管道中进行,您可以使用
ForEach-Object
:
Get-InstalledApps |
Where-Object {$_.Displayname -like "*Citrix Receiver*"} |
ForEach-Object -Process { $_.DisplayName }
或
Get-InstalledApps |
Where-Object {$_.Displayname -like "*Citrix Receiver*"} |
ForEach-Object -MemberName Item -ArgumentList DisplayName
您可以做的另一件事是更改函数以返回对象。
使用
[哈希表]
; 假设您的函数即将返回
$hash
,而不是返回:
New-Object -TypeName PSObject -Property $hash
现在,您可以使用普通的cmdlet套件,并让它们按预期工作。
编辑:
看到代码后,看起来您已经在将哈希表转换为对象了,但您的输出显示了不同的结果。它不会显示为
Name
和
Value
如果是这样的话,那么我仍然认为有问题,输出是
[哈希表]
.
编辑2:
根据来自平台差异评论的信息,这似乎是因为对象转换是使用
[pscustomobject]
type accelerator
这是在PowerShell v3中添加的。由于有问题的机器运行的是Windows 7,它可能运行的是v2(这是Win 7附带的)。
建议:
-
摆脱Windows 7。
-
如果无法做到这一点,请在该计算机上升级PowerShell(Windows Management Framework)。
-
无论哪种方式,使用
New-Object
如上所述。