gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:27:19 24 4
gpt4 key购买 nike

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:

附言以防万一,过滤env的解决方案:

  1. (Get-Item env:) | Where-对象名称 -eq 'PUBLIC'
  2. Get-Item 环境:\* | Where-对象名称 -eq 'PUBLIC'
  3. Get-ChildItem 环境: | Where-对象名称 -eq 'PUBLIC'
  4. gi 环境:|% GetEnumerator |? Name -eq 'PUBLIC'(在@santisq回答后添加,他删了)

然而,尽管 Get-Item env: 列出了所有的环境变量(但是文档说它不应该在 * 未设置指向的情况下),您无法过滤 Get-项目环境: | Where-Object Name -eq 'PUBLIC 因为 Get-Item env: | Measure-Object 计数为 1

环境:P版本 5.1.19041.610

最佳答案

EnvC 一样是 PsDrive,但具有不同的提供程序(Environment 提供程序)。

Get-Item默认情况下只返回项目本身而不是项目内容。它具有返回项目内容的能力。使用 grouping operator () 强制枚举并运行内部命令直至完成,然后再通过管道发送任何内容。

Get-Item env: 返回单个未枚举的集合,这就是计数为 1 的原因。(Get-Item env:) 枚举内部集合,它这就是计数大于 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:\Users\Public

# 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

关于powershell - 为什么括号会改变迭代类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66553854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com