【问题标题】:How to replace all spaces by underscores in all file names of a folder?如何用下划线替换文件夹的所有文件名中的所有空格?
【发布时间】:2014-01-14 11:44:14
【问题描述】:

我正在尝试重命名文件夹中的所有文件(所有 .exe 文件)。我想用下划线替换所有空格,例如qwe qwe qwe asd.exeqwe_qwe_qwe_asd.exe

我需要使用命令行来执行此操作。我尝试了很多我在互联网上甚至在这个网站上找到的可能的解决方案,但我无法让它发挥作用。

我还需要在“单行”/“一个命令”中执行此操作,但我会接受所有有效的答案。

【问题讨论】:

    标签: windows replace cmd


    【解决方案1】:

    改编自这里:

    https://stackoverflow.com/a/16129486/2000557

    @echo off
    Setlocal enabledelayedexpansion
    
    Set "Pattern= "
    Set "Replace=_"
    
    For %%a in (*.exe) Do (
        Set "File=%%~a"
        Ren "%%a" "!File:%Pattern%=%Replace%!"
    )
    
    Pause&Exit
    

    使用上述内容创建一个批处理文件(*.bat)。将该批处理文件放在包含所有 .exe 的文件夹中,当您运行它时,它将用下划线替换空格。

    【讨论】:

    • 感谢您的回答,但我不能使用批处理文件..我需要使用单个命令..
    • @MatiasElorriaga 您可以直接从 CMD 运行 for 循环 - 只有 1 个 '%' 符号,例如::::::::::::::::::::: ::::::::::: for %i in (*.css) do ( ren "%~i" "_%~i.scss" ) => 将所有扩展名为 .css 的文件重命名为“_ORIGINALFILENAME.scss”
    【解决方案2】:

    单排

    cmd /e:on /v:on /c "for %f in ("* *.exe") do (set "n=%~nxf" & set "n=!n: =_!" & ren "%~ff" "!n!" )"
    

    生成一个 cmd 实例,启用扩展和延迟扩展,并且对于名称中带有空格的每个 exe 文件,用下划线替换空格并用新名称重命名文件

    【讨论】:

    • 如何修改它以通过子文件夹递归执行?
    • @AlexR,将 for %f 替换为 for /r %f...
    • @Champion 完美解决方案
    【解决方案3】:

    使用文件:

    forfiles /m *.exe /C "cmd /e:on /v:on /c set \"Phile=@file\" & if @ISDIR==FALSE ren @file !Phile: =_!"
    

    forfiles 之后添加/s 以递归遍历子文件夹。

    【讨论】:

    • 如果您想将空格更改为破折号或破折号以强调下划线,控制“把它变成那个”逻辑的位是Phile: =_!= 之前的任何内容都将被替换。 = 后面的内容将被替换。
    【解决方案4】:

    设置数据=%date:~6,4%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%%time: ~6.2% 设置数据=%data:=0%

    【讨论】:

      【解决方案5】:

      简单如下:

      set filename=qwe qwe qwe asd.exe
      set filename=%filename: =_%
      

      【讨论】:

      • 如何重命名文件?
      • set filename=qwe qwe qwe asd.exe, set filename2=%filename: =_%, ren "filename" "filename2"
      • 只有在原始文件名为“qwe qwe qwe asc.exe”时才有效
      【解决方案6】:

      基于@Gray 的回答,我已经扩展它以递归地替换所有子目录中的文件名。

      文件 1:replace.bat

      setlocal enabledelayedexpansion
      
      set "pattern= "
      set "replace=_"
      
      for %%I in (*.ext) do (
          set "file=%%~I"
          ren "%%I" "!file:%pattern%=%replace%!"
      )
      

      文件 2:recursive.bat

      for /d /r . %%D in (*) do (
          copy replace.bat "%%D\replace.bat"
          cd "%%D"
          replace.bat
          del replace.bat
          cd..
      )
      

      文件

      • replace.bat 包含将 space 替换为 underscore 的脚本
      • recursive.bat 包含在所有子目录中执行递归的脚本

      如何使用?

      • replace.batrecursive.bat 保存在同一目录中。
      • .ext 替换为所需的文件扩展名以匹配replace.bat 中的(如.mp4)。
      • 仅双击(运行)recursive.bat 文件。

      【讨论】:

      • 这只有在我手动复制所有子文件夹中的 replace.bat 时才有效。这是相当痛苦的。我应该添加什么来手动将 replace.bat 复制到所有子文件夹?
      • 请关注如何使用部分
      • 嗯,我明白了,所以您假设只有一个子目录。在我的情况下,该目录包含许多子目录,每个子目录都有一个子目录,其中包含我要重命名的文件。我还需要将替换和递归 bat 文件都复制到每个文件中吗?
      • replace.batrecursive.bat 放在父目录中,它适用于所有子目录。
      【解决方案7】:

      将以下 2 个命令保存在 .bat 文件中。它将在所有文件和文件夹中将" " 替换为"_",递归地从存储文件的文件夹开始。

      forfiles /s /m *.* /C "cmd /e:on /v:on /c set \"Phile=@file\" & if @ISDIR==FALSE ren @file !Phile: =_!"
      forfiles /s /C "cmd /e:on /v:on /c set \"Phile=@file\" & if @ISDIR==TRUE ren @file !Phile: =_!"
      

      注意:第一行是对文件执行此操作,第二行是对文件夹执行此操作。每一行都可以单独使用。

      【讨论】:

        【解决方案8】:

        对 Hamza Rashid 的回答稍作调整。特别是他的 recursive.bat 脚本。

        recursive.bat

        set orig=%cd%
        
        for /d /r . %%D in (*) do (
            copy replace.bat "%%D\replace.bat"
            cd "%%D"
            replace.bat
            del replace.bat
            cd %orig%
        )
        

        replace.bat 保持不变,说明保持不变。

        【讨论】:

          猜你喜欢
          • 2017-05-01
          • 2020-05-27
          • 1970-01-01
          • 2022-11-23
          • 2016-09-05
          • 2018-01-28
          • 1970-01-01
          • 2018-11-25
          • 2013-01-01
          相关资源
          最近更新 更多