我对 Get-ChildItem 的 -Depth
标志有点困惑。以下效果很好(在“C:\Program Files”下找到所有文件和文件夹):
dir 'C:\Program Files\' -Depth 1
但是如果我想扩展它以仅查找 *.txt 类型的文件,我找不到如何做到这一点(下面只是给出奇怪的意外输出,其中 -Depth 1
被忽略,而是它对 所有 子文件夹(无论多深)执行 -Recurse
的等效操作):
dir 'C:\Program Files\*.txt' -Depth 1
dir 'C:\Program Files\' -Include *.txt -Depth 1
dir 'C:\Program Files\*' -Include *.txt -Depth 1
我们如何将 -Depth
用于 Get-ChildItem 的特定深度和所需的文件模式?
最佳答案
您看到的行为是 Windows PowerShell 中的一个错误,该错误已在 PowerShell [Core] 6+ 中修复 em> - 参见 this GitHub issue .
鉴于 Windows PowerShell 不再积极开发,该错误不太可能得到修复。
具体来说,Windows PowerShell 忽略 -Depth
在以下情况下的深度约束:
- 使用
-Include
或-Exclude
- 如果(隐含的)
-Path
参数包含通配符。
虽然递归仍在执行,但没有强加深度限制;实际上,-Depth
在这些情况下表现得像 -Recurse
(单独)。
解决方法:
对于
-Include
和基于通配符的-Path
参数,其中通配符仅限于最后 路径组件:- 改为使用
-Filter
,如Wasif Hasan's answer 所示. - 警告:
-Filter
通常因其卓越的性能而更受欢迎,但它的通配符语言不如 PowerShell 的和有遗留问题 - 特别是,字符集和范围([...]
)不受支持,在 Windows PowerShell 中*.xls
等过滤器也匹配*.xlsx
文件,例如 - 参见 this answer .
- 改为使用
对于
-排除
:- 仅使用
-Depth
并在事后使用Where-Object
执行过滤称呼;例如,
Get-ChildItem -File 'C:\Program Files\' -深度 1 | Where-对象名称-NotLike *.txt
- 仅使用
[可能很少需要]对于基于通配符的
-Path
参数,在组件other 中带有通配符(也),而不是最后一个(例如,C:\foo*\bar
)- 使用
-Recurse
并在事后使用Where-Object
执行过滤;在这种情况下,您还必须通过计算组件的数量来剔除太深的路径。
- 使用
关于PowerShell,具有 -Depth 输出的 Get-ChildItem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60501414/