循环和 if 语句的批处理脚本无法正确交互

循环和 if 语句的批处理脚本无法正确交互

为了存档目的,我有一个目录,里面充满了名为、、等的文件note_1.txtnote_3.txt我正在编写一个脚本来找出这些文件当中的note_4.txt最大数字,并将新文件重命名为。Nnote.txtnote_N+1.txt

我第一次使用批量 for 循环,无法使其正常工作。我尝试用 替换,%!我不确定我理解它的工作原理。

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
for /f %%i in ('dir /b note_*.txt') do (
    SET archivename=%%~ni
    SET archivenumber=%archivename:~5%
    if %archivenumber% GTR %maxfile% SET /a maxfile=%archivenumber%+1
)
echo %maxfile%
ENDLOCAL

答案1

我只是将其添加到循环!内的变量中FOR,以确保它们在循环执行时全部扩展,以确保相应地读取新的设定值,以帮助!maxfile!根据每次循环迭代获取最终值。

此外,我CD /D "%%~F0"在循环开始上方的行中添加了FOR,以确保目录更改为脚本所在的目录,因为您没有在命令示例中明确指定目录,但我也在下面添加了一个明确的示例脚本。

批处理脚本(隐式)

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
cd /d "%%~F0"
for /f %%i in ('dir /b note_*.txt') do (
    SET "archivename=%%~ni"
    SET "archivenumber=!archivename:~5!"
    if !archivenumber! GTR !maxfile! SET /a maxfile=!archivenumber!+1
)
echo !maxfile!
ENDLOCAL

批处理脚本(显式)

SETLOCAL ENABLEDELAYEDEXPANSION
SET "maxfile=1"
SET "srcdir=C:\Folder\Path"
for /f %%i in ('dir /b "%srcdir%\note_*.txt"') do (
    SET "archivename=%%~ni"
    SET "archivenumber=!archivename:~5!"
    if !archivenumber! GTR !maxfile! SET /a maxfile=!archivenumber!+1
)
echo !maxfile!
ENDLOCAL

更多资源

  • 启用延迟扩展

    延迟扩展将导致批处理文件中的变量在执行时而不是在解析时扩展,此选项通过 SETLOCAL EnableDelayedExpansion 命令打开。


    当延迟扩展生效时,可以使用 !variable_name! 立即读取变量,您还可以读取和使用将显示初始值(在行首扩展)的 %variable_name%。

  • 为了

    变量替换(FOR /?)

    此外,FOR 变量引用的替换功能也得到了增强。现在您可以使用以下可选语法:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path namey
    

相关内容