【问题标题】:Replace or delete certain characters from filenames of all files in a folder [closed]从文件夹中所有文件的文件名中替换或删除某些字符[关闭]
【发布时间】:2013-05-14 06:31:27
【问题描述】:

如何通过一些批处理文件执行删除某些字符或将某些字符替换为其他字符,对于Windows文件夹中所有文件的文件名,是否有DOS命令?

【问题讨论】:

    标签: windows file powershell batch-file cmd


    【解决方案1】:

    使用 PowerShell 为 DOS 提示符执行更智能的操作。在这里,我展示了如何批量重命名当前目录中包含空格的所有文件和目录,方法是将它们替换为_ 下划线。

    Dir |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    

    编辑:
    可选地,Where-Object 命令可用于过滤不合格连续 cmdlet (command-let) 的对象。以下是一些示例来说明它可以为您提供的灵活性:

    • 跳过任何文档文件

      Dir |
      Where-Object { $_.Name -notmatch "\.(doc|xls|ppt)x?$" } |
      Rename-Item -NewName { $_.Name -replace " ","_" }
      
    • 仅处理目录(3.0 之前的版本)

      Dir |
      Where-Object { $_.Mode -match "^d" } |
      Rename-Item -NewName { $_.Name -replace " ","_" }
      

      PowerShell v3.0 引入了新的 Dir 标志。你也可以在那里使用Dir -Directory

    • 跳过任何已经包含下划线(或其他字符)的文件

      Dir |
      Where-Object { -not $_.Name.Contains("_") } |
      Rename-Item -NewName { $_.Name -replace " ","_" }
      

    【讨论】:

    • Where-Object 的用法是什么。 aphoe answer 在没有 Where-Object 的情况下做同样的事情
    • @JesonPark 感谢您指出这一点。我在Where-Object 用法上添加了一些更好的示例。
    • Rename-Item :源路径和目标路径必须不同。错误:/
    • @MERTDOĞAN Rename-Item 如果目标路径和名称保持不变,则会静默忽略重命名请求。例如,如果没有找到要替换的空格。它不会抛出任何错误。如果您向我们提供您使用的确切 PS 命令,也许我们可以解决您的问题。
    • 对我不起作用。我想是因为我想替换点。在那种情况下,this answer 帮助了我。
    【解决方案2】:

    Windows PowerShell 中用于删除或重命名某些字符的单行命令如下所示。 (这里的空格被替换为下划线)

    Dir | Rename-Item –NewName { $_.name –replace " ","_" }
    

    【讨论】:

    • Rename-Item :源路径和目标路径必须不同。错误:/
    • 嘿我不太明白我应该在哪里输入这个命令以及如何定位我需要的目录。
    • 仅适用于 Windows 操作系统。运行Windows PowerShell。转到文件夹并运行如上命令(记得更改搜索参数)
    • 使用-creplace 进行区分大小写的搜索。
    • PowerShell Core 也支持许多其他操作系统
    【解决方案3】:

    PowerShell 的答案很好,但是 Rename-Item 命令在同一个目标目录中不起作用,除非您的所有文件中都包含不需要的字符(如果发现重复则失败)。

    如果你像我一样,有好名字和坏名字,试试这个脚本(将用下划线替换空格):

    Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") }
    

    【讨论】:

    • 这个解决方案对我有用(因为接受的答案会抛出错误,我认为由于一些文件不包含要替换的字符,正如你提到的)。 +1,我很高兴在这种情况下对 -Recurse 标志和 Move-Itemcommand 有更多解释。
    • 对我来说也是最好的解决方案。很容易抛出“被另一个进程使用”错误。关闭我所有的其他窗口解决了这个问题。谢谢达斯汀 :)
    【解决方案4】:

    这个批处理文件可以提供帮助,但它有一些限制。文件名字符 = 和 % 不能被替换(从这里的内存中),文件名中的 ^ 也可能是一个问题。

    在这部分%newname: =_% 中,在下块的每一行中,它将: 之后的字符替换为= 之后的字符,因此这组字符将被替换为下划线。

    删除 echo 以激活 ren 命令,因为它只会将命令打印到控制台窗口,直到您这样做。

    它只会处理当前文件夹,除非你将/s添加到DIR命令部分,然后它也会处理当前文件夹下的所有文件夹。

    要删除某个字符,请从 = 符号后删除该字符。在%newname:z=% 中,这样的条目会删除所有 z 字符(不区分大小写)。

    @echo off
    for /f "delims=" %%a in ('dir /a:-d /o:n /b') do call :next "%%a"
    pause
    GOTO:EOF
    :next
    set "newname=%~nx1"
    
    set "newname=%newname: =_%"
    set "newname=%newname:)=_%"
    set "newname=%newname:(=_%"
    set "newname=%newname:&=_%"
    set "newname=%newname:^=_%"
    set "newname=%newname:$=_%"
    set "newname=%newname:#=_%"
    set "newname=%newname:@=_%"
    set "newname=%newname:!=_%"
    set "newname=%newname:-=_%"
    set "newname=%newname:+=_%"
    set "newname=%newname:}=_%"
    set "newname=%newname:{=_%"
    set "newname=%newname:]=_%"
    set "newname=%newname:[=_%"
    set "newname=%newname:;=_%"
    set "newname=%newname:'=_%"
    set "newname=%newname:`=_%"
    set "newname=%newname:,=_%"
    
    echo ren %1 "%newname%
    

    【讨论】:

      【解决方案5】:

      我会为此推荐rename 命令。在命令行中输入ren /? 以获得更多帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 1970-01-01
        • 2021-07-24
        • 2017-09-22
        相关资源
        最近更新 更多