为什么括号会改变迭代类型?

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 以防万一,过滤环境的解决方案:

  1. (Get-Item env:) | Where-Object Name -eq 'PUBLIC'
  2. Get-Item env:* | Where-Object Name -eq 'PUBLIC'
  3. Get-ChildItem env: | Where-Object Name -eq 'PUBLIC'
  4. 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


以上是为什么括号会改变迭代类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>