gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:41:55 25 4
gpt4 key购买 nike

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

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

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

在 Windows 10 上使用 PowerShell 5.1。

最佳答案

tl;dr:

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

  • 一般情况下,使用Get-Item获取目标项自身的信息,使用Get-ChildItem获取相关信息它的 child


Get-Item 旨在返回给定项目自身,而 Get-ChildItem 返回其子项 .

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

Get-Item env: 类似于 Get-Item C:\,因为您要请求 PowerShell 的 root驱动自身,而不是它的 child 。

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

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

这是一个有争议的问题,因为 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 来达到相同的效果。 p>

(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(不是 Get-Item)。


[1] Get-Item env: 返回 System.Collections.Generic.Dictionary`2.Values 属性值PowerShell 用来存储环境变量信息的实例。该值作为单个对象输出,其类型是嵌套在字典类型中的集合类型,System.Collections.Generic.Dictionary`2.ValueCollection ;您可以使用 Get-Item env 检查类型:|获取成员

关于PowerShell:Get-Item 与 Get-ChildItem 输出类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59963634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com