2014-11-24 2 views
2

Я новичок в программировании окон. Мне нужно написать функцию цикла для выполнения задачи, если обнаружена определенная ошибка. См. Код ниже.Как выполнить цикл If и найти текст с помощью пакета

У меня возникла проблема с Find, которая ищет Kitchen.Error.NoRepDefinied. Скрипт выполняется пять раз, даже если ключевое слово find не найдено.

Пожалуйста, помогите мне определить проблему и объясните, что здесь не так. Любая помощь приветствуется. Я использую Windows Server 2012 R2.

set /a x=0 
:while1 
if %x% leq 5 (
    echo %x% 
    call abc.exe > C:\Logs\App_Error.log 
    set file=C:\Logs\App_error.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\App_error.log 
      ) 
      set /a x=x+1 
      goto :while1 
     ) 
    echo "OUTSIDE LOOP" 
    echo The Status is %errorlevel% 
    call:check_file 
    exit /b %errorlevel% 
) 
+0

Nice новичок усилия. +1 для сдачи в работу, прежде чем обращаться за помощью! Вы пробовали 'echo! Cnt!', Чтобы узнать, почему именно!! Cnt! neq 0'? Имеет ли смысл использовать 'if! Cnt! gtr 0'? Кроме того, попробуйте добавить «echo! Kitchen.Error.NoRepDefined!», Чтобы убедиться, что переменная имеет ожидаемое значение в цикле. – rojo

+0

Чтобы дождаться, когда ваш abc.exe заполнит и закроет журнал, чтобы вы могли использовать его правильно: 'start '"/wait abc.exe> ​​C: \ Logs \ App_Error.log' вместо 'вызова abc.exe> ​​... 'И в цикле FOR, что' ... do set/a cnt = %% a' может привести к нулю, потому что '%% a' может быть текстом. Затем попробуйте что-то вроде '... do set/a cnt = cnt + 1'. Для целей отладки попробуйте '... do echo %% a' – JosefZ

ответ

1

Упростите код.

Петля (до 5 раз), вызывающая процесс. Если процесс не возвращает уровень ошибок, если в файле журнала искомая строка не найдена, оставьте цикл.

set "logFile=c:\logs\App_Error.log" 

    for /l %%x in (1 1 5) do (
     echo Loop %%x 
     > "%logFile%" call abc.exe 
     if not errorlevel 1 (
      find "Kitchen.Error.NoRepDefinied" "%logFile%" >nul 2>&1 || goto :endLoop 
     ) 
    ) 

:endLoop 

Я не уверен, о значении errorlevel вы пытаетесь получить.

+0

Спасибо за помощь. Это действительно работает. Мне также нужна помощь в коде. Иногда мой abc.exe терпит неудачу с ошибками подключения к базе данных, которые не регистрируются при запуске приложения. Затем я решил, что мне нужно искать errorlevel 0 и строку для успеха. Теперь я хотел бы добавить еще одно условие в код, например «Найти строку», а также уровень ошибок% ERRORLEVEL% должен быть равен нулю. Как добавить второе условие в цикл – Karthi

+0

@ Karthi, код обновлен. Надеюсь, я это правильно понял –

+0

Большое спасибо. Я сделал аналогичный, но я использовал, если% ERRORLEVEL% NEQ 0. Я все еще не получал ожидаемого ответа, которого хочу. Цикл пробежал 5 раз, и условие не было выполнено. Теперь я надеюсь, что я понял синтаксис и буду использовать его для будущего. Спасибо тонну. но я сомневаюсь, почему я не смог использовать% ERRORLEVEL% в условии if и почти потратил дни, чтобы понять это. Огромное спасибо. Отмечая ответ как принятый :) – Karthi

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