为什么括号会改变迭代类型?
PS > Get-Item env: | Select-Object -First 1 | ForEach-Object GetType
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
False True ValueCollection System.Object
PS > (Get-Item env:) | Select-Object -First 1 | ForEach-Object GetType
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True DictionaryEntry System.ValueType
序言:我想知道为什么我不能使用 Where-Object 来过滤 Get-Item env:
PS 以防万一,过滤环境的解决方案:
(Get-Item env:) | Where-Object Name -eq 'PUBLIC'Get-Item env:* | Where-Object Name -eq 'PUBLIC'Get-ChildItem env: | Where-Object Name -eq 'PUBLIC'gi env: |% GetEnumerator |? Name -eq 'PUBLIC'(在@santisq回答后添加,他删除了)
然而,尽管 tharGet-Item env:列出了所有的 env 变量(但是文档说它不应该在 * 未设置指向时),你不能过滤,Get-Item env: | Where-Object Name -eq 'PUBLIC因为Get-Item env: | Measure-Object Count 是 1
环境:PSVersion 5.1.19041.610
回答
Env是一个 PsDrive 就像C,但具有不同的提供者(Environment提供者)。
默认情况下,Get-Item仅返回项目本身而不是项目内容。它具有返回项目内容的能力。在通过管道发送任何内容之前,使用分组运算符 ()强制枚举并运行内部命令以完成。
Get-Item env:返回单个未(Get-Item env:)枚举的集合,这就是计数为 1 的原因。枚举内部集合,这就是计数大于 1 的原因。如果您想要包含在 PsDrive 中的项目,您应该只使用Get-ChildItem env:. 附加您的路径*指示命令返回匹配的每个单个子项*,这与Get-ChildItem没有尾随*. 只有在枚举集合时,您才能对包含的项目应用过滤逻辑。
# No enumeration
Get-Item -Path env: | Measure | Select -Expand Count
1
Get-Item -Path env: | Where Name -eq 'PUBLIC' # returns nothing
# Forced enumeration
(Get-Item -Path env:) | Measure | Select -Expand Count
44
(Get-Item -Path env:) | Where Name -eq 'PUBLIC'
Name Value
---- -----
PUBLIC C:UsersPublic
# Implied enumeration by returning targeting child items
Get-Item -Path env:* | Measure | Select -Expand Count
44
# returns child items of target
Get-ChildItem -Path env: | Measure | Select -Expand Count
44