gpt4 book ai didi

powershell - 为什么在这个例子中我们需要括号?

转载 作者:行者123 更新时间:2023-12-02 23:07:46 25 4
gpt4 key购买 nike

为什么会这样

Get-WinUserLanguageList | Where-Object LanguageTag -eq en-US

返回空列表(似乎它不过滤值)但是这个

(Get-WinUserLanguageList) | Where-Object LanguageTag -eq en-US

有效吗?通常我不需要 () 但在这种情况下它们是强制性的,但为什么呢?

最佳答案

Usually I don't need () but in this case they are mandatory, but why?

  • (...) 强制枚举管道中包含的命令输出的集合元素。

  • 这不是必需的,但在您的情况下,因为 Get-WinUserLanguageList 表现出非标准行为:而不是将多个结果对象一个接一个输出到管道,它将整个集合[1]作为单个输出发出对象

    • 如果没有封闭的 (...),下一个管道段中的命令 - 在您的情况下为 Where-Object - 因此仅接收一个 输入 - 整个集合 - 并对其进行操作,而不是逐一操作元素。
      由于集合对象本身没有 LanguageType 属性,因此没有任何匹配项,并且您不会得到任何输出。[2]

正如评论中提到的,您可以将命令的输出通过管道传输到 Get-Member 来查看其输出对象的(不同)类型;对于标准 cmdlet,您会看到单个对象输出的类型,而不是集合类型。


[1] 具体来说,该集合是 [System.Collections.Generic.List[Microsoft.InternationalSettings.Commands.WinUserLanguage]] 类型的通用列表。

[2] 您正在使用 simplified syntax在您的命令中 - Where-Object LanguageType -eq en-US - 而不是更详细但更灵活的脚本 block 语法 - Where-Object { $_.LanguageType -eq 'en -美国'}。如果您使用后者,您的命令可能会意外返回整个集合,从而有效地返回所有语言。原因是仅脚本 block 语法适用 member-access enumeration到输入集合,这意味着即使 $_ 本身没有 .LanguageTag 属性,元素 及其值却有以数组的形式返回。使用数组作为 LHS,-eq 充当过滤器,只要 en-US 位于返回的值之中-eq 操作仍将被视为 $true,导致输入对象(整个集合)被传递。
GitHub issue #9576 中讨论了两种看似等效的语法形式之间令人惊讶的行为差异。 .

关于powershell - 为什么在这个例子中我们需要括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56080275/

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