У меня есть сценарий .cmd, который в основном выполняет массив команд в цикле for и записывает вывод в файл журнала, из которого мне нужно прочитать последнюю строку журнала и проверить, есть ли в нем строка «Finished» впоследняя строка, если строка не найдена, я не буду печатать «ошибка», иначе «сделано»
ВЫПУСК: Я запускаю этот точный код на моем компьютере с Windows10, он работает, как и ожидалось выше. Но когда это запускается в «windows 2012 R2» (мой служебный сервер), происходит даже тогда, когда последняя строка моего cmd [0] в файле журнала говорит «готово», вместо «готово» отображается «ошибка» !! !! 1005
ли это в основном означает, что ошибка не обнаружена должным образом из команды, он не умеет читать значение! lastline! ? или это проблема разницы между машинами для запуска сценариев .cmd.
setlocal EnableDelayedExpansion
SET cmd[0]=command1
SET cmd[1]=command2
setlocal EnableDelayedExpansion
SET /A "fail = 1"
for /F "tokens=2 delims==" %%s in ('set cmd[') do (
if !fail! equ 1 (
%%s >>%LOGFILE% 2>>&1
echo "ERROR LEVEL OF above command RUN IS %errorlevel%"
if not %errorlevel%==0 (set errmsg=Unable to logon )
echo "trying to read the lastline from the logfile"
for /f "usebackq delims=" %%b in (%LOGFILE%) do set lastline=%%b
echo !lastline! >> %LOGFILE%
echo !lastline! | findstr /I /R /C:"Finished" && (
echo "done" )
) || (
echo "error"
)
)
)
После дальнейшей отладки этой проблемы на компьютере 2012R2 я редактирую заголовок этого вопроса и предоставляю дополнительные обновления:
Похоже, что настоящая проблема связана с echo Я говорю это, потому что, хотя echo! Lastline! записывает вывод в файл tmp.txt на моем компьютере с windows10, он не записывает вывод в файл tmp.txt, когда скрипт запускается через окнаМашина 2012R2.
Я подошел к той же проблеме с альтернативой, используя следующий код:
SetLocal EnableDelayedExpansion
SET cmd[0]=command1
SET cmd[1]=command2
SetLocal EnableDelayedExpansion
@echo off
SET /A "fail = 1"
for /F "tokens=2 delims==" %%s in ('set cmd[') do (
**del "C:\Program Files\Tabcmd\Command Line Utility\tmp.txt"**
if !fail! equ 1 (
%%s >>%LOGFILE% 2>>&1
if not %errorlevel%==0 (set errmsg=Unable to logon & goto Problem)
echo "entering another for loop for checking last line"
for /f "usebackq delims=" %%b in (%LOGFILE%) do set lastline=%%b
**echo !lastline!>tmp.txt**
findstr "Finished refresh of extracts" tmp.txt && (
SET /A "fail = !fail! + 1"
echo "done") || ( echo "error")
)