Поэтому я создаю руководства под окнами, используя командный файл. Инструмент обработки руководств имеет ошибочные сообщения об ошибках. Я не могу просто использовать код ошибки. Кроме того, я должен проверить журнал на наличие ошибок.Команды 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
Да, это, кажется, решение. Я должен использовать «not errorlevel 1» в качестве условия тестирования, но в остальном он отлично работает. Большое спасибо. _omg, я ненавижу партию soo, это сильно сосут так ужасно ... я имею в виду, что sh и bash уже испорчены, но как может быть намного хуже? _ – user3331950
@ user3331950 - если вы так сильно ненавидите партию, хороший кусок людей, которые просматривают Тег [batch-file] скажет вам вместо этого использовать PowerShell. Что-то об этом было более мощным и с псевдонимами для пользователей Linux. Лично это не мое дело, но многие люди клянутся им в том, что они делают из командной строки. – SomethingDark
Но командные файлы смешные! Те же самые непонятные оперативные правила, которые вызывают все эти проблемы, позволяют использовать пакетные файлы совершенно незапланированными способами, которые удивительно интересны! Этот момент просто не существует ни на одном «реальном языке программирования», который имеет более четкие правила (они скучны). ** '' ** ;-) – Aacini