Get-ChildItem 不同的命令

Get-ChildItem different commands

PowerShell 中的以下命令有什么区别?

Get-ChildItem C:\Users -Directory

Get-ChildItem C:\Users | Where-Object {$_.PSIsContainer -eq $true}

他们似乎给出了相同的结果。有区别吗?

更新:

我刚开始学习powershell,对大部分术语都不熟悉。两条命令的结果如下:


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----          7.9.2021     22.35                Administrator
d-----          7.9.2021     15.40                MyDevice
d-r---          6.5.2020     11.59                Public
d-----          7.9.2021     22.45                student

评论中有很多信息;让我尝试提炼和补充它:

  • Where-Object { $_.PSIsContainer -eq $true }(或者更好,Where-Object { $_.PSIsContainer })用于限制 Get-ChildItem's output to directories as well as Where-Object { -not $_.PSIsContainer } for limiting output to files were only needed up to the (long obsolete) v2 of PowerShell, as Olaf 指出。

  • v3引入动态-Directory-File切换参数为Get-ChildItem 允许直接过滤目录/文件的输出。

功能上,你问题中的两个命令是等价的,但是使用-File / -Directory不仅更简洁,而且更快,因为需要在管道中涉及两个命令总是会增加开销。

  • 正如 Abraham Zinala 建议的那样,最好在 来源 处进行过滤,这就是 -File-Directory 做; -Filter 参数也是如此,用于将输出限制为名称与 *.txt 等通配符模式匹配的项目(其他 cmdlet 也支持(特定于命令的)-Filter 参数,并且它们始终值得使用,因为它们在执行速度和内存使用方面都提高了性能。

注意:严格来说,这些命令只等同于文件系统路径 ,而 PowerShell 的驱动器概念还包含其他类型的数据存储,通过所谓的 providers.

只有 FileSystem 提供程序公开了 -Directory-File 开关(即所谓的 dynamic parameters)。

因此对于与 不同 提供程序相关的路径 - 假设该提供程序具有类似于涉及 两个项目子类型的文件系统的对象层次结构 leaf 项(类似于 files)和 container 项(类似于 directories) - 可能仍然需要单独的 cmdlet 调用,例如 Where-Object { $_.PSIsContainer } - 除非该提供程序实现了自己的 -Directory-File 开关的模拟。

在 PowerShell 附带的提供程序中,容器和叶项之间的区别仅适用于 WSMan(驱动器 wsman:)和证书提供程序(驱动器 cert:);其他提供者仅公开 单个 项目类型,要么是因为他们的数据是 非分层 (例如,Env 提供者 - 尝试Get-ChildItem Env:) 或因为其他实体公开为 properties 而不是 itemsRegistry 提供程序公开了 仅限容器 - 注册表 - 而注册表属性 这些容器)。