使用批处理文件按顺序检查最高文件名的最快方法?

时间:2015-01-20 14:19:17

标签: batch-file batch-rename

我试图使用批处理文件将所有文件保存在按顺序编号的特定文件夹中(0,1,2,...)。要做到这一点,我首先要知道这个序列中的最大数字是什么,所以我可以将非顺序命名的文件附加到列表的末尾。例如,我可能有以下文件:

0.png

1.JPG

2.JPG

3.png

file_51.jpg

pictureabc.png

这将返回3的结果,因为它是序列中的最后一个文件名。然后我就能找到剩下的文件(不确定最好的方法)并从4开始编号。

到目前为止,我提出的唯一解决方案是使用无限goto循环,当没有包含该数字的文件名时,该循环停止。

set count=0
:loop
if exist %count%.* set /a count+=1 & goto loop

此解决方案效率非常低,并且对于10万张图像需要将近一分钟。我正在寻找能够在10秒内实现这一目标的解决方案。

2 个答案:

答案 0 :(得分:0)

@echo off
    setlocal enableextensions disabledelayedexpansion

    setlocal enabledelayedexpansion
    set "nextFile=0" & for /f "delims=" %%a in ('
        dir /a-d /b ^| findstr  /b /r /x 
                       /c:"[1-9][0-9]*\.[^.]*" 
                       /c:"[1-9][0-9]*"
                       /c:"0" 
    ') do if %%~na geq !nextFile! set /a "nextFile=%%~na+1"
    endlocal & set "nextFile=%nextFile%"

    echo Next file will be: %nextFile%

这只是使用dir命令来检索所有文件的列表,使用findstr进行过滤以仅获取具有数字名称的文件。其余的只是将文件名与之前的最大值进行比较。

已修改 - 这应该足够快

@if (@This === @IsBatch) 
@echo off
    rem Start of batch zone ----------------------------------------------
    setlocal enableextensions disabledelayedexpansion

    for /f %%a in ('
        dir /a-d /b /o-d 
        ^| findstr /r /x /c:"[0-9][0-9]*\.[^.]*" /c:"[0-9][0-9]*" 
        ^| cscript //nologo //e:jscript "%~f0" 
    ') do set "nextFile=%%a"

    echo next file will be %nextFile%

    exit /b
@end
    // Start of JScript zone ---------------------------------------------
    var inputStream = WScript.StdIn;
    var max = 0, value ;
    while(!WScript.StdIn.AtEndOfStream) {
        value = parseInt( inputStream.ReadLine().split('.')[0], 10 );
        if ( value >= max ) max = value + 1;
    }
    WScript.StdOut.WriteLine( max );        

这是一个混合批处理/ jscript文件。保存为.cmd文件,它使用dir命令检索文件列表,findstr只保留带编号名称的文件,然后使用本机JScript引擎提取数字和寻找最大的价值。

答案 1 :(得分:0)

我认为这是最快的方式:

@echo off
setlocal EnableDelayedExpansion
set lastNum=0
for /L %%a in (1,1,9) do (
   for %%b in (%%a*.*) do (
      if %%~Nb gtr !lastNum! (
         set lastNum=%%~Nb
      )
   )
)
echo Last numbered file: %lastNum%

编辑添加新方法

以前的方法取决于现有文件的数量,因此它没有我预期的那么快......

无论文件数量如何,下面的新方法几乎都是同一时间:

@echo off
setlocal EnableDelayedExpansion
set "names="
for /L %%i in (1,1,9) do set "names=!names! %%i*.*"
dir /B /A-D /O-D %names% 2> NUL | ( set /P "lastNum=" & set lastNum ) > lastNum.txt
for /F "tokens=2 delims==." %%a in (lastNum.txt) do set "lastNum=%%a"
del lastNum.txt
echo Last numbered file: %lastNum%

如果最后一个文件中的多个文件具有相同的创建时间,则上一个方法可能失败,但如果需要,可以修复此点。