2015-07-13 6 views
1

Поэтому я создаю руководства под окнами, используя командный файл. Инструмент обработки руководств имеет ошибочные сообщения об ошибках. Я не могу просто использовать код ошибки. Кроме того, я должен проверить журнал на наличие ошибок.Команды findsh/find Windows ведут себя по-разному относительно ERRORLEVEL при запуске внутри и вне пакетного файла

Чтобы сделать эту проверку ошибок я хочу использовать следующий фрагмент кода в пакетном файле:

findstr /L /I /C:" not found in " "%WORKSPACE%\%2.log" 
if %ERRORLEVEL% NEQ 1 (
    rem do error handling stuff 
) 

При вводе Findstr/найти команду консоли в cmd.exe-окне он, как ожидается, и устанавливает ожидаемый ERRORLEVEL. Он устанавливает ERRORLEVEL в 0, если что-то найдено. Он устанавливает ERRORLEVEL в 1, если ничего не найдено.

Моя проблема: findstr/find ведет себя по-разному внутри пакетного файла. Он установит значение ERRORLEVEL равным 0, даже если ничего не найдено. Не имеет значения, запущен ли командный файл jenkins или я запускаю командный файл внутри cmd.exe-окна.

Я уже пробовал:

  • находкой и Findstr, обе команды вызывают ту же проблему
  • проверки, если я бегу Findstr на правильный файл: Да, это тот же самый файл. Я использую абсолютные пути и делаю командный файл эхом поиска файла. При запуске findstr/find вне пакетного файла при поиске он устанавливает ERRORLEVEL, как ожидалось.
  • проверка, если я запустил findstr с той же строкой поиска: Да, это правильная строка поиска. Я даже пытался позволить findstr прочитать строку поиска из файла с помощью опции/G.
  • mixup с вариантом Linux команды find: это не вариант Linux команды find, так как findstr имеет такое же поведение.

Вот полный пакетный файл, который я использую, если soemone указывает причину моей проблемы где-то еще в файле. Спасибо за ваше время.

set BEGIN_TIME=%TIME% 

if bServerAdmin NEQ %USERNAME% (
    echo This file is designed to be run on the build server. 
    echo Are you sure you want to run it? 
    echo Press CTRL+C to abort 
    echo Press Return to continue 
    pause 
) 

rem ======================================== 
rem Set some variable that influence the run 
rem ======================================== 
set HELP_AND_MANUAL="C:\Program Files\HelpAndManual\helpman.exe" 
rem 7zip executable to use, http://www.7-zip.org/ 
set SEVEN_ZIP="C:\Program Files\7-Zip\7z.exe" 

rem =================================================== 
rem Make sure working directory exists and switch to it 
rem =================================================== 
if not exist output mkdir output 
call :pushdWithErrCheck output 

rem =============== 
rem Clear old stuff 
rem =============== 
del /Q /S /F * 

rem ====== 
rem German 
rem ====== 
call :helpAndManualWithErrCheck XXXXXXX\XX\XXXXXXX.hmxp XXXXXXX.chm xxxxx.hmskin 
call :helpAndManualWithErrCheck AAAA\AA\AAAA.hmxp  AAAA\AAAA.chm xxxxx.hmskin 
call :helpAndManualWithErrCheck BBBB\BB\BBBB.hmxp  BBBB\BBBB.chm xxxxx.hmskin 
call :helpAndManualWithErrCheck CCCC\CC\CCCC.hmxp  CCCC\CCCC.chm xxxxx.hmskin 

rem ====================== 
rem Pack all build results 
rem ====================== 
%SEVEN_ZIP% a -bd ..\Manuale.7z 
IF %ERRORLEVEL% NEQ 0 exit 1 

popd 

exit 0 

:helpAndManualWithErrCheck 
IF EXIST %WORKSPACE%\%1 (
    echo building %1 now 
    if exist %WORKSPACE%\output\%2 (
     echo Error: output file exists before build was started 
     Exit 1 
    ) 
    %HELP_AND_MANUAL% %WORKSPACE%\%1 /CHM=%WORKSPACE%\output\%2 /L="%WORKSPACE%\%2.log" /O=%WORKSPACE%\_Design\HTML-Skin\%3 
    IF %ERRORLEVEL% NEQ 0 (
     IF %ERRORLEVEL% NEQ 2 (
      rem ERRORLEVEL 2 is not an error either http://www.helpandmanual.com/help/index.html?hm_advanced_commandline_exitcodes.htm 
      echo Error: exiting due to bad exit code now 
      Exit 1 
     ) 
    ) 
    if not exist %WORKSPACE%\output\%2 (
     echo Error: exiting due to missing file now 
     Exit 1 
    ) 
    rem debugging stuff echo findstr /L /I /C:" not found in " "%WORKSPACE%\%2.log" 
    rem debugging stuff findstr /L /I /C:" not found in " "%WORKSPACE%\%2.log" 
    rem debugging stuff echo %ERRORLEVEL% 
    findstr /L /I /C:" not found in " "%WORKSPACE%\%2.log" 
    if %ERRORLEVEL% NEQ 1 (
     echo Error: exiting due to missing file according to HelpAndManual Log 
     Exit 1 
    ) 
) ELSE (
    echo Skipping %1 as the source file does not exist 
) 
goto :EOF 

:pushdWithErrCheck 
pushd %1 
if %ERRORLEVEL% NEQ 0 Exit 1 
goto :EOF 

ответ

2

Ваша главная задача называется normal vs delayed variable expansion

Для теста errorlvel лучше использовать

findstr /L /I /C:" not found in " "%WORKSPACE%\%2.log" 
if errorlevel 1 (
    rem do error handling stuff 
) 

Обратите внимание, что выражение if errorlevel n будет оценена истина для любого errorlevel значение больше или равно n

+0

Да, это, кажется, решение. Я должен использовать «not errorlevel 1» в качестве условия тестирования, но в остальном он отлично работает. Большое спасибо. _omg, я ненавижу партию soo, это сильно сосут так ужасно ... я имею в виду, что sh и bash уже испорчены, но как может быть намного хуже? _ – user3331950

+0

@ user3331950 - если вы так сильно ненавидите партию, хороший кусок людей, которые просматривают Тег [batch-file] скажет вам вместо этого использовать PowerShell. Что-то об этом было более мощным и с псевдонимами для пользователей Linux. Лично это не мое дело, но многие люди клянутся им в том, что они делают из командной строки. – SomethingDark

+0

Но командные файлы смешные! Те же самые непонятные оперативные правила, которые вызывают все эти проблемы, позволяют использовать пакетные файлы совершенно незапланированными способами, которые удивительно интересны! Этот момент просто не существует ни на одном «реальном языке программирования», который имеет более четкие правила (они скучны). ** '' ** ;-) – Aacini