【问题标题】:Renaming all files in the folder重命名文件夹中的所有文件
【发布时间】:2013-03-20 12:48:25
【问题描述】:

如何使用 Windows 批处理重命名文件夹中的所有文件? 基本上,名称中以_Done开头的部分应该去掉:

some_file_name_Done_34534576456.CSV -> some_file_name.CSV some_other_file_name_Done_23232343.CSV -> some_other_file_name.CSV

【问题讨论】:

  • 您可能会发现Bulk Rename Here 更直观。
  • 很遗憾,我无法使用第三方应用程序。

标签: windows for-loop batch-file cmd directory


【解决方案1】:

试试这个,批量解决:

@echo off &setlocal enabledelayedexpansion
FOR %%i in (*.*) do call:process "%%~i"
GOTO :eof

:process
set "fname=%~n1"
set "tname=%fname:*_Done=%"
if "%fname%"=="%tname%" echo %~1: nothing to do&goto :eof
set "fname=!fname:_Done%tname%=!%~x1"
if exist "%fname%" echo %fname%: already exists&goto :eof
ren "%~1" "%fname%"
goto :eof

endlocal

编辑:将一些 ! 更改为 % 以进行澄清。这不会改变效果。

【讨论】:

    【解决方案2】:

    如果您不介意使用其他语言,可以使用正则表达式重命名。这是您在 JScript 中要求的内容。将其另存为 something.js,将其放在包含 CSV 文件的目录中,然后使用 cscript /nologo something.js 运行它。

    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var folder = fso.GetFolder(".");
    
    var files = new Enumerator(folder.Files);
    
    while (!files.atEnd()) {
        var file = '' + files.item();
        if (/\.csv$/i.test(file)) {
            var dest = file.replace(/_Done[^\.]+/i, '');
            if (dest != file) {
                WSH.Echo('Renaming ' + file + ' -> ' + dest);
                files.item().Move(dest);
            }
        }
        files.moveNext();
    }
    

    【讨论】: