PowerShell,具有 -Depth 输出的 Get-ChildItem

标签 powershell recursion

我对 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/

相关文章:

powershell - 如何设置 PowerShell 脚本运行的时间限制?

CSV 格式的 Powershell 组对象并将其导出

C++ - 解决数独游戏

在C中递归计算PI

powershell - -包含或匹配多个值

powershell - Bower 安装命令不起作用

sql-server - 为 Dacpac 和 Powershell 脚本创建 Nuget 包

function - 本地函数相互调用

python - 双重递归 - 运行时错误 : maximum recursion depth exceeded error

python - 链表,如果 __init__() 中参数中的元素是可迭代的,则从中构造新的链表