2014-11-21 2 views
0

Я просто пытаюсь запустить базовое пакетное программирование. Я получаю ошибку во время выполненияWindows-пакетное программирование - Неожиданно в это время

set /a x=0 
:while1 
if %x% leq 5 (
    echo %x% 
    goto:callfun 
    /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 

callfun: 
CALL C:\Pentaho\pdi-ce-5.2.0.0-209\data-integration\kitchen.bat /rep:"Admin" /job:"XXXX" 

Я получаю сообщение об ошибке при

множества/а «х = 0»

0 был неожиданным в это время.

Что я здесь делаю неправильно?

+0

Удалите и все пробелы по обе стороны от '=' символов.Ваша первая строка не устанавливает x в 0, но устанавливает переменную 'x' в строку' 0' (обратите внимание на пробелы). Кроме того, у основания есть 'set/d' - нет опции'/d'. Вы хотите '/ a' для математики. – SomethingDark

+0

Я отредактировал код выше и по-прежнему получаю ту же ошибку. Кроме того, код завершается в случае, если NEQ 0 (. – Karthi

+0

. Вам требуется замедленное расширение. Http://stackoverflow.com/a/20854972/2152082 объясняет это. – Stephan

ответ

0

Для меня, похоже, что ошибка вызвана наличием «CALL» в блоке скобок. Вместо использования блока скобок внутри оператора IF поместите код, который находится в скобках во внешнем «методе GOTO». Вы должны быть осторожны со скобками в пакетном программировании dos. Лично я разработал стиль кода, который редко им нужен.

+0

Привет, вы можете видеть edite-код, и я получаю ту же ошибку – Karthi

+0

Извините, я забыл подчеркнуть, что в любое время, в пакетном файле, когда у вас есть скобка внутри скобок, тогда вы попадаете в неприятности. Попробуйте перезаписать сценарий, не используя никаких скобок, и я уверен, что это работает. Вы должны ТОЛЬКО использовать круглые скобки, когда вы уверены, что то, что вы делаете, является 't будет проблематичным для парсера DOS. – djangofan

1

Эпизод около 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.

(я только затрагивались ошибки замедленного расширения - другие проблемы помечены РЗМ)

+0

Но кавычки часто полезны с помощью SET/A при использовании каких-либо из '!', '<<', '>>', '&', '^', '|' operato rs (также варианты назначения). Без кавычек операторы должны быть экранированы. – dbenham

+0

@dbenham: ах, да - правда, но почти за 20 лет написания сценариев в стиле NT я никогда не испытывал желания использовать этих операторов. Или, может быть, я ухитрился избежать их. Хорошая точка зрения. – Magoo

Смежные вопросы