使用批处理文件按输入的顺序重命名文件?

使用批处理文件按输入的顺序重命名文件?

我所在的公司负责处理账单,我经常需要通过比较输入到数据库的内容和实际的账单图像来检查这些账单的准确性。每当我发现处理过程中出现错误时,我都必须从数据库中删除账单,并将图像发送给处理器,以便重新正确输入账单。但是,我们的系统经常遇到故障,如果我尝试将账单上传到服务器并将其发送给处理器,系统会提示存在重复文件。为了绕过这个问题,我必须手动将每张图片重命名为新名称(我们使用控制号卷来命名我们的图片)。

我想自动执行此过程,以便我可以按顺序快速重命名这些文件。我希望我的批处理文件有一个输入,以便我可以输入起始控制编号,它将按顺序重命名目录中的每个文件,从控制编号开始,我为目录中的每个附加文件输入 +1,例如它将像这样:

批处理文件要求我启动控制号。我输入 6654821。

  • 法案3210851.pdf重命名为6654821
  • 图像账单654.pdf重命名为6654822
  • 随机名称.pdf重命名为6654823
  • 账单错误.pdf重命名为6654824
  • 发送手册.pdf重命名为6654825

文件的原始名称根本不相关,它们不需要保持任何特定顺序,只要按顺序重命名即可。

到目前为止我所拥有的是这样的:

@echo OFF
title Batch Rename
color 5f

echo Hello! I'm the batch pdf renamer. Please enter the starting control number:
set /p start=

ren %userprofile%\desktop\needrenamed\*.pdf "%p%.pdf"

pause

显然,这并没有解决按顺序重命名文件的问题。我有点被困在这里了。

答案1

这已在 Windows 7 Professional 中进行了测试。不执行任何类型的错误检查。它会重命名当前目录中的文件,因此脚本应该位于您的路径上的某个位置。

@echo off
set /p start=Please enter the starting control number: 

setlocal enableDelayedExpansion

for /r %%g in (*.pdf) do (call :RenameIt %%g)
goto :eof
goto :exit

:RenameIt
echo Renaming "%~nx1" to !start!%~x1
ren "%~nx1" !start!%~x1
set /a start+=1
goto :eof

:exit
exit /b

希望有帮助!

答案2

我已经编写了这个批处理脚本并将其放在我的要点回购。它需要 Windows Scripting Host 访问权限。以下是文件:

@set @junk=1 /*
@echo off
cscript //nologo //E:jscript %0 %*
goto :eof
*/

var args=WScript.Arguments, shell=WScript.CreateObject("WScript.Shell"), bForced=false, nStartIndex=-1;

if(args.length==0||(args.length==1&&(bForced=args(0).toLowerCase()=='-f'||args(0).toLowerCase()=='--force'))) {
    showHelp();
    WScript.Echo("\nERROR: You must provide a starting value to begin counting at.");
    WScript.Quit(1);
}
if(args(0)=='-?'||args(0).toLowerCase()=='--help') {
    showHelp();
    WScript.Quit(0);
}
if(isNaN(nStartIndex=parseInt(args(bForced?1:0)))||nStartIndex<0) {
    showHelp();
    WScript.Echo(sprintf("\nERROR: The value [%s] which was given for start index is invalid. It should be a positive integer.", nStartIndex));
    WScript.Quit(2);
}

var fso=new ActiveXObject("Scripting.FileSystemObject");
var folder=fso.GetFolder(shell.CurrentDirectory);
var enFiles=new Enumerator(folder.Files);
var oFile, file_path, file_ext;

if(!bForced) {
    for(var nCurDX=nStartIndex; !enFiles.atEnd(); enFiles.moveNext(), nCurDX++) {
        oFile=enFiles.item();
        file_path=oFile.Name;
        file_ext=getFileExt(file_path);
        WScript.Echo(sprintf("Rename %s to %s", file_path, nCurDX+file_ext));
    }
    WScript.Echo("Type 'yes' to continue...");
    if(WScript.StdIn.ReadLine().toLowerCase()!="yes") {
        WScript.Echo("\nAction cancelled by user.");
        WScript.Quit(-1);
    }
    enFiles=new Enumerator(folder.Files);
}

for(var nCurDX=nStartIndex; !enFiles.atEnd(); enFiles.moveNext(), nCurDX++) {
    oFile=enFiles.item();
    file_path=oFile.Name;
    file_ext=getFileExt(file_path);
    try {
        oFile.Name = nCurDX+file_ext;
    } catch(e) {
        WScript.Echo(sprintf("\nERROR: Cannot rename file:\n\t%s\n\nReason: %s\n", file_path, e.description));
        WScript.Quit(3);
    }
}

/////////////////////////////////
/////////// FUNCTIONS ///////////
/////////////////////////////////

function sprintf(format, etc) { var arg=arguments, i=1; return format.replace(/%((%)|s)/g, function (m) { return m[2] || arg[i++] }); }
function showHelp() {
    WScript.Echo("------------------");
    WScript.Echo("Numeric Rename All");
    WScript.Echo("------------------");
    WScript.Echo("");
    WScript.Echo("This file will change the file title of all files is a directory");
    WScript.Echo("so that they are all just an incremented number with the original");
    WScript.Echo("extension still in place.");
    WScript.Echo("");
    WScript.Echo("Usage: NUMERIC_RENAME_ALL [ -? | --help ] [ -f | --force ] <start-index>");
    WScript.Echo("");
    WScript.Echo("\t-?, --help\tDisplay this help screen and exit.");
    WScript.Echo("");
    WScript.Echo("\t-f, --force\tRename the files without prompting first.");
    WScript.Echo("");
    WScript.Echo("\t<start-index>\tThe value to begin counting at.");
    WScript.Echo("");
    WScript.Echo("This script takes one parameter and that is the number to begin at.");
    WScript.Echo("For example (if called with 12345 as the parameter):");
    WScript.Echo("");
    WScript.Echo("\ttest1.jpg becomes 12345.jpg");
    WScript.Echo("\ttest1.jpg.txt becomes 12346.jpg.txt");
    WScript.Echo("\ttest2.pdf becomes 12347.jpg");
    WScript.Echo("");
    WScript.Echo("Currently, there is no way to sort the items and they will be");
    WScript.Echo("numbered according to the default file order for your system.");
    WScript.Echo("");
    WScript.Echo("----------------------");
}
function getFileExt(file_path) {
    var dx=file_path.lastIndexOf("\\"), ret;
    if(dx==-1) dx=file_path.lastIndexOf("/");
    ret=file_path.substring(dx+1);
    return (dx=ret.indexOf("."))==-1?"":("."+ret.substring(dx+1));
}

将其保存NUMERIC_RENAME_ALL.BAT在容易到达的地方。

在普通的批处理文件中执行此操作会很困难,因为 cmd.exe 无法在循环内设置变量。这就是我们使用 Batch\WSH Hybrid 文件执行此操作的原因(这在脚本的前 5 行中声明)。可能还有一个相当简单的方法可以做到这一点,那就是使用 power shell。

答案3

@echo off
    setlocal enableextensions disabledelayedexpansion

    set /p "number=Please enter the starting control number:" || goto :eof

    for /f "delims=" %%a in ('dir /b *.pdf') do (
        setlocal enabledelayedexpansion
        for %%b in (!number!) do (
            endlocal
            echo ren "%%~fa" %%b
        )
        set /a "number+=1"
    )

对于.pdf当前文件夹中的每个文件,将该文件重命名为当前编号并增加编号。

重命名操作只会回显到控制台。如果输出正确,请删除命令echo前缀的ren

答案4

我尝试了 JSanches 的解决方案,但是对我没有作用。

然后尝试了 MC ND 的解决方案但输出文件没有扩展名。

我不想进行 Windows 脚本主机访问,所以没有尝试 krowe 的解决方案,

最后 Neo 的解决方案没有奏效,但我喜欢它的语法。

我已将其改编为可行的语法(见下文)。(请注意,第一次执行批处理脚本,因此以下是我的假设)。

打开记事本

复制以下文字

将其保存为“Rename_files.bat”,并存放在文件所在的同一文件夹中。

要开心

@echo off
setlocal enabledelayedexpansion
set /a counter=0
for /r %%a in (%1\*.pdf) do (
    timeout /t 1 nobreak
    echo %%~fa
    set /a counter += 1
    echo ren %%~fa !counter!%%~xa
    set zcounter=0000!counter!
    set source=“%%~fa”
    set target=“Document!zcounter:~-4!%%~xa”
    echo renaming !source! to !target!
    ren !source! !target!
)
timeout /t 3 /nobreak

解释

prevent all commands in a batch file (including the echo off command) from displaying on the screen
Enable the delayed environment variable expansion 
define variable counter as 0
for each file (%%a) in (regardless of name but as.pdf) do (
    Delay 1 second
    Display path/file
    increase variable counter +1
    Display message “path/file as counter and maintain extension
    Define zcounter as 0000 with current value of counter
    Define source as path/file
    define  target as Document with value of zcounter up to last 4 characters and maintain file extension.
    Display message “renaming source to target”
    rename source as target
)
Delay 3 seconds

您当然可以删除所有回声和超时,除非您想看看发生了什么。

此外,第一条显示消息可以删除“回显”文本并将文件重命名为仅数字。如果您愿意的话。

相关内容