首页 > 解决方案 > 批处理脚本读取文件的数字部分并用下一个更高的整数重命名

问题描述

我有一个文件,例如-

foofile_1.ext

脚本应该读取文件的数字部分,然后用下一个整数重命名文件,即执行后,文件名应该是

foofile_2.ext

我可以使用C++ / c应用程序甚至在bash但不确定如何编写batch脚本来执行此重命名。之前的文件名_不会改变,并且_会出现在文件名中的相同位置。

我可以将文件名剥离为_,但识别数字是我不熟悉的实现。一旦我识别出数字,我就可以增加它并重命名文件。

标签: windowsbatch-file

解决方案


需要考虑的是,重命名foofile_1.extfoofile_2.ext将失败应该foofile_2.ext已经存在。解决它的一种方法是按数字降序重命名,我之前在 SO 上发布了类似的答案。

但是,我不会在这里发布相同的答案,也不会链接该答案。但是,我将展示另一种方法:

@echo off
setlocal enabledelayedexpansion

for /f "tokens=1,*delims=_" %%i in ('dir /b /a-d "*_*.ext"') do (
     echo %%~nj | findstr /R /V /C:"[A-Z]">nul && (
     set /a numeric=%%~nj+1
     ren "%%~i_%%~j" "%%~i_-hld-!numeric!%%~xj"
   )
)
for /f "delims=" %%f in ('dir /b /a-d "*_-hld-*.ext"') do (
    set "name=%%~f"
    ren "%%~f" !name:-hld-=!
)

考虑到您的输入如您所说,并且不包含之前_的任何地方。这只会采用*_*.ext格式的每个文件。我们将 the 拆分_为两个标记的元变量 (%%i%%j) 我们取数值并加一,然后重新加入%%ipre _。然而,当您尝试重命名的文件存在时,问题就出现了,因此,首先我们测试是否%%~nj只有字母字符,使用findstr(在这个免费代码中不做特殊字符)其次我们给出一个临时添加到名称以防止名称冲突。

完成后,我们只需对包含_-hld-临时包含的所有文件进行重命名。


推荐阅读