使用批处理脚本在目录中重命名多个文件

8

我有大约1000张图片,它们的名称类似于“IMG-12223”。我想将它们重命名为1、2、3、4……1000。我已经编写了一个批处理脚本来列出文件,但我不知道如何对每个文件进行重命名。例如,将名称为“IMG-12223”的第一张图片重命名为1,将名称为“IMG-23441”的第二张图片重命名为2,以此类推...

for /r %%i in (*) do (
    echo %c% 
)

只是一个提示:免费的多媒体查看器IrfanView内置了一个批量重命名功能,可以使用计数器重命名图像。此外,共享软件文件管理器Total Commander具有多重命名功能,提供更多选项并且非常易于使用。在我看来,对于不会自动执行计划任务的文件重命名任务,使用批处理文件没有意义。 - Mofi
3个回答

12

以下是脚本代码。将其放入您的文件夹并运行即可。

@echo off & setlocal EnableDelayedExpansion 

set a=1
for /f "delims=" %%i in ('dir /b *') do (
  if not "%%~nxi"=="%~nx0" (
    ren "%%i" "!a!" 
    set /a a+=1
 ) 
) 

如果您想保留文件扩展名,例如将“IMG-12223.jpg”、“IMG-12224.jpg”等重命名为“1.jpg”、“2.jpg””等,可以使用下面的脚本。

@echo off & setlocal EnableDelayedExpansion 

set a=1
for /f "delims=" %%i in ('dir /b *.jpg') do (
  ren "%%i" "!a!.jpg" 
  set /a a+=1
) 

[更新] 下面是对Jack评论中提到的代码行的解释:

  • setlocal EnableDelayedExpansion

通常情况下,我们希望变量a在执行时延迟扩展,而不是在读取该行时。如果没有这个命令,变量a将不能获得其递增的值,而始终为1。

有关EnableDelayedExpansion的详细信息,请参见答案https://dev59.com/u2w15IYBdhLWcg3wVaMa#18464353

  • for /f "delims=" %%i in ('dir /b *.jpg')

这里使用带有/b选项的dir列出所有jpg文件的文件名。

for循环遍历并重命名所有jpg文件。

对于delims选项,由于默认的分隔符是空格,在文件名中包含空格的图片文件中,如果不使用delims=选项,则会失败。例如,如果有一个名为“img with spaces.jpg”的图像文件,没有使用该选项,则%%i的值为“img”,而不是整个名称“img with spaces.jpg”,这是不正确的。

有关for循环的详细信息,请参见页面http://ss64.com/nt/for_f.html

  • if not "%%~ni"=="%~n0"

我已将其更改为if not "%%~nxi"=="%~nx0",以使其更准确。同时,附带的代码也已更新。

实际上,它用于避免重命名批处理文件本身。如果我们仅限制重命名“jpg”文件,则不需要这行代码。

%%~nxi是每个遍历的文件的带有扩展名的文件名。而%~nx0是正在运行的批处理文件的名称和扩展名。有关详细信息,请参见页面DOS BAT file equivalent to Unix basename command?


谢谢您的回复,您能否解释一下以下几行代码的含义:“setlocal EnableDelayedExpansion”,“for /f "delims=" %%i in ('dir /b *.jpg')",以及“if not "%%ni"=="%n0"”? - Jack Mc Lauren
当然,我刚刚改进了脚本,并且还为你提到的行添加了解释。实际上,你也可以稍微更改脚本,以将图像目录作为参数传入。 - Landys

7

无需批处理脚本。从命令行输入一个简单的一行命令即可完成任务 :-)

我使用 DIR /B 生成文件列表,通过管道符传递给 FINDSTR 对文件进行编号,然后将其全部包含在 FOR /F 中以解析结果并执行重命名操作。

for /f "delims=: tokens=1*" %A in ('dir /b *.jpg^|findstr /n "^"') do @ren "%B" "%A%~xB"

如果您想将命令放入批处理脚本中,请将百分比加倍。

0
尝试这个,如果你有一对名称值在文本文件中,那么循环值并进行操作。名称值由空格分隔。这使您可以相应地映射旧->新文件名。或者您可以保留idx + 1计数器,并将其用于新文件名。

keyvalue.bat

@echo off
set idx=0
for /F "tokens=1,2" %%A in (keyvalue.txt) do call :PROCESS "%%A"  "%%B"
GOTO :END

:PROCESS
set var1=%~1
set var2=%~2
set /A idx=%idx%+1
echo %var1% goes to %var2% (%idx%)
GOTO :EOF

:END
pause

keyvalue.txt

file888.dat  newfile1.dat
file333.dat  newfile2.dat
file9.dat    newfile3.dat
file01.dat   newfile4.dat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接