代码之家  ›  专栏  ›  技术社区  ›  MMedina

将powershell应用于子文件夹

  •  1
  • MMedina  · 技术社区  · 6 月前

    我有很多文件夹,里面有意外保存而没有扩展名的图像文件。 我已经设法弄清楚如何添加扩展名:

    ls -file | ? {$_.extension -eq ''} | % {ren $_ ($_.name + '.jpeg')}
    

    …但我无法弄清楚如何将其应用于所有子文件夹。
    此命令不起作用:

    Get-ChildItem -Recurse ls -file | ? {$_.extension -eq ''} | % {ren $_ ($_.name + '.jpeg')}
    

    你知道我哪里做错了吗?

    1 回复  |  直到 6 月前
        1
  •  2
  •   Mathias R. Jessen    6 月前

    首先,确保删除 ls Get-ChildItem -Recurse ls -file - ls 是的别名 Get-ChildItem ,并且由于您已经指定了cmdlet名称,PowerShell将尝试查找名为的文件夹 ls 并从那里开始搜索。

    第二,而不是通过 $_ Rename-Item (别名 ren )作为位置论证, 管它 :

    Get-ChildItem -Recurse -File | ? {$_.extension -eq ''} | Rename-Item -NewName { $_.Name + '.jpeg' }
    

    将整个文件信息对象管道传输到 重命名项目 允许PowerShell绑定正确的 绝对的 文件系统对象的路径,因此它将开始为嵌套文件夹中的文件工作。

        2
  •  0
  •   mklement0    6 月前

    Mathias' helpful answer 很好地解释了这个问题,并提供了一个有效的解决方案。


    添加 用a 性能改进 :

    为了 递归查找全部 扩展少 文件夹 ,您可以替换:

    Get-ChildItem -Recurse -File | ? {$_.extension -eq ''}
    

    与:

    Get-ChildItem -Recurse -File -Filter *.
    

    其性能要好得多,因为过滤发生在 来源 (低级文件系统API)而不是事后通过 Where-Object (其内置别名为 ? where ).

    注:

    • *. 仅匹配扩展名较少的文件依赖于 遗留怪癖 -Filter 争论。

      • 这个 -过滤器 通配符语法为 一样 PowerShell s wildcard expressions 值得注意的是, *. 一起工作 Get-ChildItem s -Include / -Exclude 参数,仅支持PowerShell通配符。
    • 虽然有帮助 case,支持的通配符语法不一致 -过滤器 是潜在的陷阱;尤其是, -Filter *.* 限制与文件的匹配 具有 延期;它匹配 全部的 文件,并且实际上是冗余的。

      • 相比之下,在PowerShell的通配符语法中, *.* 理智地 仅匹配文件 具有 延期,但有一些注意事项:
        • 使用 -包括 -排除 有其自身的陷阱-请参阅 this answer .
        • 因为,就像 对象在哪里 方法,执行过滤 之后 事实( 全部的 文件被枚举 然后 经过过滤),它比 -过滤器 使用。
    • 关于过滤的底线 获取儿童物品 :

      • 使用 -过滤器 为了获得最佳性能,但要小心它的怪癖,请参阅 this answer 查看概述。

      • 使用 -包括 如果你需要支持 倍数 模式和/或无怪癖语法和/或扩展功能,即使用 [...] 对于字符集和范围,但要注意以下违反直觉的行为 -Recurse 已使用-请参阅底部部分 这个答案 .

      • 使用 对象在哪里 对于后过滤,如果您需要执行比通配符表达式所能提供的更复杂的过滤;在传递给的脚本块内 对象在哪里 ,您可以使用 regexes 例如用于匹配。