PowerShell:Get Item与Get ChildItem输出类型

PowerShell:Get Item与Get ChildItem输出类型,powershell,sorting,get-childitem,sort-object,Powershell,Sorting,Get Childitem,Sort Object,我试图按字母顺序(按名称)打印环境变量,我能想到的第一件事是: Get Item env:|排序对象-属性名称 但是输出总是未排序的。然后我尝试了以下方法 Get ChildItem env:|排序对象-属性名称 并得到了预期的、正确排序的输出。这表明Get Item和Get ChildItem的输出不是相同的类型,即使Get Item env:和Get ChildItem env:的(格式化)输出看起来完全相同(即字典) 通过管道将命令输出到|Get TypeData发现Get Item en

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

Get Item env:|排序对象-属性名称

但是输出总是未排序的。然后我尝试了以下方法

Get ChildItem env:|排序对象-属性名称

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

通过管道将命令输出到
|Get TypeData
发现
Get Item env:
实际上似乎只返回单个
System.Collections.DictionaryEntry
,而
Get ChildItem env:
返回多个
System.Collections.DictionaryEntry
对象

有人能解释一下这里到底发生了什么吗?为什么两种看似不同的输入数据类型会产生外观相同的输出/字符串表示?PowerShell是否正在从
Get Item
output隐式“取消装箱”单个条目字典对象


在Windows 10上使用PowerShell 5.1。

tl;医生:

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

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


Get Item
用于返回给定的项本身,而
Get ChildItem
则返回其子项

注意:
Get ChildItem
对于根据定义不能有子项的项,例如单个环境变量或文件,返回到项本身-请参阅底部部分。

Get Item env:
类似于
Get Item C:\
,因为您要求的是PowerShell驱动器本身的根目录,而不是其子目录

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

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

这是一个没有实际意义的问题,因为
Get ChildItem env:
将以概念上更清晰的方式为您提供相同的功能,但您可以使用
(…)
,强制枚举集合中
Get Item env:
输出的项:

# Currently the same as: Get-ChildItem env: | Sort-Object Name
(Get-Item env:) | Sort-Object Name
如果PowerShell返回整个字典而不是它的条目集合,这样您就可以访问
.Keys
来获取所有环境变量名,而
.Values
来获取所有值,那么更有意义的是什么呢。(字典/哈希表不应在PowerShell管道中枚举)

事实上,由于以下原因,您可以通过访问当前由
Get Item env:

(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
语法是的一个实例,与
获取内容环境:路径
(而不是
获取项目


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