【问题标题】:Rename multiple files in a directory using batch script使用批处理脚本重命名目录中的多个文件
【发布时间】:2014-10-24 08:15:29
【问题描述】:

我有大约 1000 张图像,它们的名称类似于“IMG-12223”。我想将它们重命名为 1 2 3 4 ... 1000。我该怎么做。我编写了一个列出文件的批处理脚本,但我不知道如何重命名每个文件。例如将名称为“IMG-12223”的第一个图像重命名为 1 ,将名称为“IMG-23441”的第二个图像重命名为 2 ,依此类推...

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

【问题讨论】:

  • 提示:免费多媒体查看器IrfanView 内置batch rename 功能,可使用计数器重命名图像。此外,共享软件文件管理器Total Commander 具有multi-rename 功能,具有更多选项且非常易于使用。在我看来,将批处理文件用于此类文件重命名任务没有作为计划任务自动执行是没有意义的。

标签: file batch-file rename


【解决方案1】:

这是脚本。只需将脚本放入您的文件夹并运行即可。

@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://*.com/a/18464353/2749114

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

此处dir 带有/b 选项,仅列出所有jpg 文件的文件名。

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

对于delims 选项,由于默认分隔符是空格,如果没有选项delims=,它会在文件名中带有空格的图像文件中失败。 IE。对于名为“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"。并且附上的代码已经更新。

它实际上是用来避免重命名bat文件本身。如果我们将重命名限制在“jpg”文件上,则不需要该行。

%%~nxi 是遍历的每个文件的文件名和扩展名。而%~nx0 是正在运行的带有扩展名的bat 文件。详情请参阅页面DOS BAT file equivalent to Unix basename command?

【讨论】:

  • 感谢您的回复,能否请您解释以下几行 "setlocal EnableDelayedExpansion" , "for /f "delims=" %%i in ('dir /b *.jpg')" , if不是 "%%~ni"=="%~n0"
  • 当然,我刚刚改进了脚本,还为您提到的行添加了解释。其实你也可以稍微修改一下脚本,把图片的目录作为参数。
【解决方案2】:

不需要批处理脚本。一个简单的命令行中的一行就可以完成这项工作:-)

我使用 DIR /B 生成文件列表,通过管道传输到 FINDSTR 以对文件进行编号,所有文件都包含在 FOR /F 中以解析结果并执行重命名。

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

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

【讨论】:

    【解决方案3】:

    试试这个,你在一个文本文件中有一对名称值,然后循环值并施展魔法。名称值由空格分隔。这允许您相应地映射旧->新文件名。或者您保留 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
    

    【讨论】: