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
的输出到目录以及用于限制输出到文件的Where-Object { -not $_.PSIsContainer }
需要 PowerShell 的(早已过时的)v2,如 Olaf指出。v3 向
Get 引入了动态
允许直接过滤输出到目录/文件。-Directory
和-File
开关参数-ChildItem
功能上,问题中的两个命令是等效的,但是使用 -File
/-Directory
不仅更方便简洁,而且更快,因为需要在管道中涉及两个命令必然会增加开销。
- 如Abraham Zinala建议,最好在源处进行过滤,这就是
-File
和-Directory
所做的;-Filter
参数也是如此,用于将输出限制为名称与通配符模式匹配的项目,例如*.txt
(其他 cmdlet 也支持(特定于命令的)-过滤
参数,它们总是值得使用,因为它们在执行速度和内存使用方面都提高了性能。
注意:严格来说,这些命令仅适用于文件系统路径,而 PowerShell 的驱动器概念还包含其他类型的数据商店,通过所谓的 providers .
只有 FileSystem
提供程序公开 -Directory
和 -File
开关(如所谓的 dynamic parameters )。
因此,对于与不同提供者相关的路径 - 假设该提供者具有类似于涉及两个项目子类型的文件系统的对象层次结构,leaf 项目(类似于文件)和容器项目(类似于目录) - 单独的cmdlet调用,例如Where-可能仍然需要对象 { $_.PSIsContainer }
- 除非该提供程序实现其自己的 -Directory
和 -File
开关模拟。
在 PowerShell 附带的提供程序中,容器和叶项之间的区别仅适用于 WSMan(驱动器 wsman:
)和证书提供程序(驱动器 cert:
) ;其他提供程序仅公开单个项目类型,因为它们的数据非分层(例如,Env
提供程序 - 尝试 Get-ChildItem Env:
)或者因为其他实体被公开为属性而不是项目(Registry
提供者,它公开仅容器 - 注册表键 - 而注册表值是这些容器的属性。
关于powershell - Get-Childitem不同的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69094233/