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