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 而不是 items (Registry
提供程序公开了 仅限容器 - 注册表键 - 而注册表值是属性 这些容器)。
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 asWhere-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 而不是 items (Registry
提供程序公开了 仅限容器 - 注册表键 - 而注册表值是属性 这些容器)。