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

File 使用批处理脚本重命名目录中的多个文件,file,batch-file,rename,File,Batch File,Rename,我有大约1000张图片,它们的名字像“IMG-12223”。我想把它们重命名为1234。。。1000我该怎么做呢。我已经写了一个批处理脚本,其中列出了文件,但我不知道如何重命名每个文件。e、 g.将名为“IMG-12223”的第一幅图像重命名为1,将名为“IMG-23441”的第二幅图像重命名为2,依此类推 for /r %%i in (*) do ( echo %c% ) 这是剧本。只需将脚本放在文件夹中并运行它 @echo off & setlocal EnableDel

我有大约1000张图片,它们的名字像“IMG-12223”。我想把它们重命名为1234。。。1000我该怎么做呢。我已经写了一个批处理脚本,其中列出了文件,但我不知道如何重命名每个文件。e、 g.将名为“IMG-12223”的第一幅图像重命名为1,将名为“IMG-23441”的第二幅图像重命名为2,依此类推

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

这是剧本。只需将脚本放在文件夹中并运行它

@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
) 
[更新]以下是对杰克评论中提到的句子的解释

  • setlocal EnableDelayedExpansion
通常,我们希望变量
a
在执行时延迟扩展,而不是读取行。没有它,变量
a
无法获得其增加的值,但始终为1

有关EnableDelayedExpansion的详细信息,请参阅答案

  • 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”,这是不正确的

有关循环的
,请参阅本页

  • 如果不是“%%~ni”==“%%~n0”
如果不是“%%~nxi”=“%%~nx0”
,我必须将其更改为
,以便更准确。所附代码已更新

它实际上用于避免重命名bat文件本身。如果我们只对“jpg”文件进行重命名,那么就不需要该行


%%~nxi
是所遍历的每个文件的扩展名。
%~nx0
是扩展名为的正在运行的bat文件。详情请参阅本页

试试这个,你在一个文本文件中有一对namevalues,然后循环值,然后做魔术。名称值之间用空格分隔。这允许您相应地映射旧文件名->新文件名。或者保留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
file888.dat  newfile1.dat
file333.dat  newfile2.dat
file9.dat    newfile3.dat
file01.dat   newfile4.dat
keyvalue.txt

@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
file888.dat  newfile1.dat
file333.dat  newfile2.dat
file9.dat    newfile3.dat
file01.dat   newfile4.dat

不需要批处理脚本。命令行中的一个简单的单行程序可以完成此任务:-)

我使用DIR/B生成文件列表,通过管道发送到FINDSTR对文件进行编号,所有文件都用n FOR/F括起来,以解析结果并执行重命名

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

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

感谢您的回复,请您解释以下几行:“setlocal EnableDelayedExpansion”,“for/f”delims=“%%i in('dir/b*.jpg')”,如果不是“%%~ni”=“%%~n0”当然,我刚刚改进了脚本,还为您提到的几行添加了解释。实际上,你也可以修改一下脚本,把你的图片目录作为一个参数。只是一个提示:免费多媒体浏览器内置了一个功能,可以用计数器重命名图片。此外,共享软件文件管理器有一个功能,有更多的选项,非常容易使用。在我看来,使用批处理文件来完成这样一个文件重命名任务没有按照计划任务自动执行是没有意义的。