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