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-Item
和 Get-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
检查类型
我试图按字母顺序(按名称)打印出环境变量,我想到的第一件事是:
Get-Item env: | Sort-Object -Property Name
但输出始终未排序。然后我尝试了以下
Get-ChildItem env: | Sort-Object -Property Name
并得到预期的、正确排序的输出。这表明 Get-Item
和 Get-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.1tl;博士:
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