Эпизод около 2 млрд delayedexpansion
В пределах оператора блока (a parenthesised series of statements)
, блок вся анализируется и затем выполняется. Любой %var%
в блоке будет заменен значением этой переменной на момент анализа блока - до того, как блок будет выполнен - то же самое относится к FOR ... DO (block)
.
Следовательно, IF (something) else (somethingelse)
будет выполнен с использованием значений %variables%
в момент возникновения ошибки IF
.
Два распространенный способ преодоления этого является: 1) использовать setlocal enabledelayedexpansion
и использовать !var!
вместо %var%
, чтобы получить доступ к измененному значению var
или 2) для вызова подпрограммы, чтобы выполнить дальнейшую обработку с использованием измененных значений.
отсюда - легко исправить:
SETLOCAL ENABLEDELAYEDEXPANSION
set /a x=0
:while1
if %x% leq 5 (
echo !x!
goto callfun
REM this following line appear to make no sense in winbatch
/dir:/Prod /user:admin /pass:anc /level:error >> C:\Logs\A.txt
set "file=C:\Logs\J_FINANCIALS_EVENING.log"
set /a cnt=0
for /f %%a in ('type "%file%"^|find "!Kitchen.Error.NoRepDefinied!" /i /c') do set /a cnt=%%a
if !cnt! NEQ 0 (
if !x! NEQ 5 (
DEL C:\Logs\abc.txt
)
set /a x=x+1
goto while1
)
echo "OUTSIDE LOOP"
echo The Status is !errorlevel!
call :check_file
exit /b !errorlevel!
)
endlocal
REM Note that this will fall-through to the process. Best add
GOTO :EOF
REM Here.
REM Colon must precede label
:callfun
CALL C:\Pentaho\pdi-ce-5.2.0.0-209\data-integration\kitchen.bat /rep:"Admin" /job:"XXXX"
REM Note that this would exit the subroutine by reaching (apparent) EOF. Best add
GOTO :EOF
REM Here - as a habit - it contributes to preventing fall-through failures
REM if you add a new subroutine and forget to include the newly-required goto :eof
Примечания:
GOTO делает не требуют двоеточие на этикетке за исключением в частном случае :EOF
, который определен для обозначения end of file
SET/a не необходимые котировки.
SET «stringname = stringvalue» является хорошим синтаксисом для присвоений строк, поскольку котировки вызывают любые конечные пробелы в строке до , а не, которые включены в присвоенное значение.
%var%
любой, который изменяется в пределах цикла должно стать !var!
с delayedexpansion
, чтобы получить доступ к run-time
, а не значения parse-time
.
(я только затрагивались ошибки замедленного расширения - другие проблемы помечены РЗМ)
Удалите и все пробелы по обе стороны от '=' символов.Ваша первая строка не устанавливает x в 0, но устанавливает переменную 'x' в строку' 0' (обратите внимание на пробелы). Кроме того, у основания есть 'set/d' - нет опции'/d'. Вы хотите '/ a' для математики. – SomethingDark
Я отредактировал код выше и по-прежнему получаю ту же ошибку. Кроме того, код завершается в случае, если NEQ 0 (. – Karthi
. Вам требуется замедленное расширение. Http://stackoverflow.com/a/20854972/2152082 объясняет это. – Stephan