如何编写 Windows 批处理文件,通过数值更新文件夹中的所有文件名?
How to write a Windows batch file that updates all file names in a folder by a numeric value?
我有一个文件夹 "C:\Pictures\test",其中包含大约 200 张照片,仅此而已。 (实际上,在我让这段代码工作之前,它只包含 2 张照片。)这些照片是不同的文件类型(.png、.jpg 等),它们的名称都是数字。我想为这些文件名添加一个固定数字,例如“4500.png”->“4700.png”和“4501.jpg”->“4701.jpg”。我预计这种情况会再次发生,所以我真的很想自动化它。因此,几个小时前,我了解到存在 Windows 个批处理文件。请温柔点——我什至不知道如何询问我不明白的事情。 (在这个问题之前用谷歌搜索了两个小时。其中一些甚至很有帮助。)
通过拼凑在别处找到的代码,我编写了这段代码(请注意,我并不真正关心捕获任何异常):
::renames all files in a folder by adding a fixed value
@ECHO OFF
SET /p addnum="Enter number to add to all photo names: "
SET /p loc="Enter folder location to navigate to: "
CD %loc%
FOR /F %%i IN ("*.*") DO (SET newname = SET /a %%i+%addnum% & SET file_name = %newname%)
PAUSE
通过 CD
的一切都有效。但是 FOR
语句行没有(难怪——这是我没有从某处复制的代码的唯一部分!)。当我 运行 它时,它没有抱怨,但它也没有做任何事情——没有输出;文件名没有变化。
我希望 DO
语句执行的操作:
- 定义一个变量
newname
就是文件名%%i
(记住,这是一个数字)+addnum
- 设置文件名
%%i
为<newname>.<extension>
我应该如何编写这个批处理文件?
可以使用以下批处理文件,它只有基本的错误处理。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "addnum=100"
set "loc=."
set /P "addnum=Enter number to add to all photo names: "
set /P "loc=Enter folder location to navigate to: "
pushd "%loc%"
if errorlevel 1 goto EndBatch
setlocal EnableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir *.jpg *.png /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R "^[0123456789][0123456789]*\.jpg$ ^[0123456789][0123456789]*\.png$"') do (
set /A NewName=%%~nI + addnum
ren "%%I" "!NewName!%%~xI"
)
endlocal
popd
:EndBatch
endlocal
pause
要了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
cd /?
dir /?
echo /?
endlocal /?
findstr /?
for /?
goto /?
if /?
pause /?
popd /?
pushd /?
ren /?
set /?
setlocal /?
我有一个文件夹 "C:\Pictures\test",其中包含大约 200 张照片,仅此而已。 (实际上,在我让这段代码工作之前,它只包含 2 张照片。)这些照片是不同的文件类型(.png、.jpg 等),它们的名称都是数字。我想为这些文件名添加一个固定数字,例如“4500.png”->“4700.png”和“4501.jpg”->“4701.jpg”。我预计这种情况会再次发生,所以我真的很想自动化它。因此,几个小时前,我了解到存在 Windows 个批处理文件。请温柔点——我什至不知道如何询问我不明白的事情。 (在这个问题之前用谷歌搜索了两个小时。其中一些甚至很有帮助。)
通过拼凑在别处找到的代码,我编写了这段代码(请注意,我并不真正关心捕获任何异常):
::renames all files in a folder by adding a fixed value
@ECHO OFF
SET /p addnum="Enter number to add to all photo names: "
SET /p loc="Enter folder location to navigate to: "
CD %loc%
FOR /F %%i IN ("*.*") DO (SET newname = SET /a %%i+%addnum% & SET file_name = %newname%)
PAUSE
通过 CD
的一切都有效。但是 FOR
语句行没有(难怪——这是我没有从某处复制的代码的唯一部分!)。当我 运行 它时,它没有抱怨,但它也没有做任何事情——没有输出;文件名没有变化。
我希望 DO
语句执行的操作:
- 定义一个变量
newname
就是文件名%%i
(记住,这是一个数字)+addnum
- 设置文件名
%%i
为<newname>.<extension>
我应该如何编写这个批处理文件?
可以使用以下批处理文件,它只有基本的错误处理。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "addnum=100"
set "loc=."
set /P "addnum=Enter number to add to all photo names: "
set /P "loc=Enter folder location to navigate to: "
pushd "%loc%"
if errorlevel 1 goto EndBatch
setlocal EnableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir *.jpg *.png /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /I /R "^[0123456789][0123456789]*\.jpg$ ^[0123456789][0123456789]*\.png$"') do (
set /A NewName=%%~nI + addnum
ren "%%I" "!NewName!%%~xI"
)
endlocal
popd
:EndBatch
endlocal
pause
要了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
cd /?
dir /?
echo /?
endlocal /?
findstr /?
for /?
goto /?
if /?
pause /?
popd /?
pushd /?
ren /?
set /?
setlocal /?