【问题标题】:PowerShell: Get-Item vs Get-ChildItem output typesPowerShell:Get-Item 与 Get-ChildItem 输出类型
【发布时间】:2020-01-29 09:03:44
【问题描述】:

我试图按字母顺序(按名称)打印环境变量,我能想到的第一件事是:

Get-Item env: | Sort-Object -Property Name

但输出始终未排序。然后我尝试了以下

Get-ChildItem env: | Sort-Object -Property Name

并得到预期的、正确排序的输出。这表明Get-ItemGet-ChildItem 的输出类型不同,即使Get-Item env:Get-ChildItem env: 的(格式化)输出看起来完全相同(即字典)

将命令的输出传送到| Get-TypeData 显示Get-Item env: 似乎实际上只返回单个System.Collections.DictionaryEntry,而Get-ChildItem env: 返回多个System.Collections.DictionaryEntry 对象。

有人能解释一下这里到底发生了什么吗?为什么两种看似不同的输入数据类型会产生相同的输出/字符串表示? PowerShell 是否对 Get-Item 输出中的单项字典对象进行了一些隐式“拆箱”?

在 Windows 10 上使用 PowerShell 5.1。

【问题讨论】:

    标签: powershell sorting get-childitem sort-object


    【解决方案1】:

    tl;博士:

    • Get-Item 不值得与env: 驱动器的root 一起使用;要枚举当前进程的环境变量,请改用Get-ChildItem env:

    • 通常,使用Get-Item 获取目标项目本身的信息,使用Get-ChildItem 获取其子项的信息。


    Get-Item 旨在返回给定项本身,而Get-ChildItem 返回其子项

    注意:Get-ChildItem回退到项目本身,用于根据定义不能有子项的项目,例如单独的环境变量或文件 - 见底部。

    Get-Item env: 类似于Get-Item C:\,因为您要求的是 PowerShell 驱动器本身root,而不是它的子驱动器。

    env: 是包含当前进程中定义的所有环境变量的 PowerShell 驱动器,作为它自己它目前具有有限实用程序的表示,只能访问它的 子代 按预期工作。 (将此与根 目录 进行对比,例如 C:\,它本身具有有意义的属性,例如时间戳、权限等)

    PowerShell 为env: 驱动器返回的是条目集合,它用于存储有关各个环境变量的信息作为单个对象[1],这是通常的行为,因为通常期望命令将集合的元素发送到管道,一个接一个。关于该项目本身的信息实际上也包括孩子也是不寻常的。

    这是一个有争议的问题,因为Get-ChildItem env: 将以概念上更清晰的方式为您提供相同的功能,但您可以使用(...)grouping operator强制枚举项目在Get-Item env: 输出的集合中:

    # Currently the same as: Get-ChildItem env: | Sort-Object Name
    (Get-Item env:) | Sort-Object Name
    

    如果 PowerShell 返回整个字典而不是它的条目集合,那可能更有意义,这样您就可以访问.Keys 以获取所有环境变量names 和 .Values 获取所有值。 (字典/哈希表预计会在 PowerShell 管道中枚举)。

    实际上,由于member-access enumeration,你可以通过访问Get-Item env:当前返回的条目集合上的属性.Key.Value来达到相同的效果

    (Get-Item env:).Name  # returns array of all env.-var. *names*; same as .Key 
    
    (Get-Item env:).Value  # returns array of all *values*
    

    “草率地”使用Get-ChildItem

    如上所述,对于根据定义不能有子项的项类型,Get-ChildItem 回退到Get-Item 行为,因此以下两个命令实际上是等效的:

    Get-Item env:Path
    
    # Same, because an environment variable can never have children,
    # but it's better to use Get-Item.
    Get-ChildItem env:Path
    

    但是,在这种情况下,从概念上讲,最好使用Get-Item,因为它明确地表达了意图

    顺便说一句:直接检索给定环境变量的常用$env:PATH语法是namespace variable notation的一个实例,相当于
    Get-Content env:PATH(不是@ 987654356@).


    [1] Get-Item env: 返回 PowerShell 用于存储有关环境变量信息的 System.Collections.Generic.Dictionary`2 实例的 .Values 属性值。该值作为单个对象输出,其类型是嵌套在字典类型System.Collections.Generic.Dictionary`2.ValueCollection 内的集合类型;您可以使用 Get-Item env: | Get-Member

    检查类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-10
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多