DOS / Batch文件在出错时跳出for循环

时间:2014-11-13 15:33:09

标签: windows batch-file cmd

我正在编写一个批处理脚本,我在其中检查dir中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

1 个答案:

答案 0 :(得分:2)

好的,我找到了答案。问题是DOS / Batch将循环视为一个单一命令。我的意思是,如果你在调用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