tl;博士:
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
检查类型