PowerShell:Get-Item 与 Get-ChildItem 输出类型

PowerShell: Get-Item vs Get-ChildItem output types

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

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: 似乎实际上 return 只是单个 System.Collections.DictionaryEntry,而 Get-ChildItem env: returns 多个 System.Collections.DictionaryEntry 个对象。

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

在 Windows 10.

上使用 PowerShell 5.1

tl;博士:

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

  • 一般情况下,使用Get-Item获取目标项自身的信息,Get-ChildItem获取其[=]的信息82=]child仁.


Get-Item 旨在 return 给定项目 本身 ,而 Get-ChildItem return 其 child任.

注意:Get-ChildItem回退到根据定义不能有 children 的项目本身,例如个人环境变量或文件 - 请参阅底部。

Get-Item env: 类似于 Get-Item C:\,因为您要求的是 PowerShell 驱动器 本身 [=117] 的 root =],不是它的 children.

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

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

这是一个有争议的问题,因为 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 return编辑了整个字典而不是它的条目集合,那么可以说更有意义的是什么您可以访问 .Keys 以获取所有 environment-variable names.Values 以获取所有值。 (字典/哈希表 不会 预计会在 PowerShell 管道中枚举)。

事实上,由于 member-access enumeration,您可以通过访问当前由 return 编辑的条目集合的属性 .Key.Value 来达到相同的效果21=]

(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

如前所述,对于根据定义不能有 child 项的项类型,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语法是的一个实例,相当于
Get-Content env:PATH(不是 Get-Item)。


[1]Get-Item env:return是.Values属性的值System.Collections.Generic.Dictionary`2 instance that PowerShell uses to store information about environment variables. That value is output as a single object, and its type is a collection type nested inside the dictionary type, System.Collections.Generic.Dictionary`2.ValueCollection;您可以使用 Get-Item env: | Get-Member

检查类型