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