windows - DOS/批处理文件出错时退出 for 循环

标签 windows batch-file cmd

我正在编写一个批处理脚本,在其中检查目录中 PDF 文件名的长度。如果文件名长度超过 3 个字符,那么我需要跳出 for 循环。这应该发生在第一个有问题的文件上。我的问题是我似乎找不到摆脱循环的方法。

这是我拥有的代码和我得到的输出。我的问题是,我用来设置 0 和 1 之间的 errorCnt 变量永远不会更改为 1,即使我正在设置它

echo STARTING SCRIPT
setlocal

set errorCnt=0
for %%a in (test*.pdf) do (

    echo %%~a

    SET "fullname=%%a"
    SET "name=%%~na

    call :strlen result name

    call :finalresult

    echo Error count is %errorCnt%

    if %errorCnt%==1 (
        echo break
        goto :break
      )

)

:break

goto :EOF


:strlen <resultVar> <stringVar>
(   
    setlocal EnableDelayedExpansion
    set "s=!%~2!#"
    set "len=0"
    for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
        if "!s:~%%P,1!" NEQ "" ( 
            set /a "len+=%%P"
            set "s=!s:~%%P!"
        )
    )
)
( 
    endlocal
    set "%~1=%len%"
    exit /b
)

:finalresult
echo %name% - characters: %result%
if %result% GTR 3 GOTO error1

goto :EOF

:error1
echo ERROR: There are too many characters in this PDF filename.
set errorCnt=1

goto :EOF

输出:

STARTING SCRIPT
test1.pdf
test1 - characters: 5
ERROR: There are too many characters in this PDF filename.
Error count is 0
test2.pdf
test2 - characters: 5
ERROR: There are too many characters in this PDF filename.
Error count is 0

最佳答案

好的,我找到了答案。问题在于 DOS/Batch 将 for 循环视为单个命令。我的意思是,如果您在调用 for 循环之前设置了一个变量,那么无论您在代码中的其他位置更改它,它都保持不变。

解决方法是使用 EnableDelayedExpansion。

Batch script for loop won't set variable

一旦我将代码更改为这样,它就可以很好地工作。

echo STARTING SCRIPT

setlocal enabledelayedexpansion

...
rem notice the ! signs

if !errorCnt!==1 (
        echo break
        goto :break
      )

STARTING SCRIPT
test1.pdf
test1 - characters: 5
ERROR: There are too many characters in this PDF filename.
Error count is 1
break

关于windows - DOS/批处理文件出错时退出 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912535/

相关文章:

c - 当您使用 void (*)() 指针调用返回 int 的函数时会发生什么?

c++ - 如何将字符串流中的数据打印到文件中?

c++ - 如何将 HICON 保存为 .ico 文件?

batch-file - ffmpeg 批处理文件疑难解答。带字幕硬编码的 mkv 到 mp4 转换

command-line - 命令提示符不会将目录更改到另一个驱动器

python - 如何以像素为单位计算 Windows CMD shell 的宽度?

c++ - 有没有一种方法可以衡量应用程序/程序占用了多少系统资源(例如 RAM)

batch-file - Windows 批处理文件 - ENABLEDELAYEDEXPANSION 查询

java - 在 Windows 批处理文件中编译 CLASSPATH

xml - 如何在 Windows 7 中使用 cmd 使用 cURL 发布 XML 数据?