如何编写 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 语句执行的操作:

我应该如何编写这个批处理文件?

可以使用以下批处理文件,它只有基本的错误处理。

@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 /?