我有大约1000张图片,他们的名字就像“IMG-12223”。我想将它们重命名为1 2 3 4 ... 1000.我该怎么做。我写了一个批处理脚本列出文件,但我不知道如何重命名每个文件。例如将名为“IMG-12223”的第一个图像重命名为1,将名称为“IMG-23441”的第二个图像重命名为2,依此类推......
for /r %%i in (*) do (
echo %c%
)
答案 0 :(得分: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
)
[更新]以下是杰克评论中提及的行的解释。
setlocal EnableDelayedExpansion
通常,我们希望变量a
在执行时延迟扩展但不读取行。没有它,变量a
无法获得增加的值,但始终为1.
有关EnableDelayedExpansion的详细信息,请参阅答案https://stackoverflow.com/a/18464353/2749114。
for /f "delims=" %%i in ('dir /b *.jpg')
此处dir
/b
选项,仅列出所有jpg文件的文件名。
for
循环遍历并重命名所有jpg文件。
对于delims
选项,由于默认分隔符是空格而没有选项delims=
,因此它会失败,文件名中包含空格的图像文件。 I.E.对于名为“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?。
答案 1 :(得分:7)
不需要批处理脚本。命令行中的一个简单的衬管可以完成这项工作: - )
我使用DIR / B生成文件列表,通过管道传输到FINDSTR以对文件进行编号,所有文件都包含在FOR / F中以解析结果并执行重命名。
for /f "delims=: tokens=1*" %A in ('dir /b *.jpg^|findstr /n "^"') do @ren "%B" "%A%~xB"
如果要将命令放在批处理脚本中,则加倍百分比。
答案 2 :(得分: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