Форум программистов, компьютерный форум, киберфорум
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/34: Рейтинг темы: голосов - 34, средняя оценка - 4.97
4 / 4 / 2
Регистрация: 30.11.2015
Сообщений: 29
1

Получение ERRORLEVEL команды TASKKILL

09.03.2016, 09:51. Показов 6114. Ответов 13

Author24 — интернет-сервис помощи студентам
Здравствуйте. В системе периодически запускается скрипт, работа которого занимает определенное время и который не всегда успевает завершить работу до очередного запуска. Начало этого скрипта выглядит так:
Windows Batch file
1
2
3
4
5
6
@ECHO OFF
title KILL_MY_SCRIPT
 
taskkill /F /FI "WINDOWTITLE eq Администратор:  MY_SCRIPT" /t
 
title MY_SCRIPT
То есть запускающийся скрипт завершает предыдущий.

Стоит задача узнать был ли он завершен (taskkill) скриптом или завершился ранее самостоятельно. Хотел воспользоваться такой конструкцией
Windows Batch file
1
2
taskkill /F /FI "WINDOWTITLE eq Администратор:  MY_SCRIPT" /t
ECHO Уровень ошибки=%errorlevel%
Но errorlevel всегда выдает 0, даже если, "задачи, соответствующие указанным критериям, отсутствуют."
Хотел провернуть так:
Windows Batch file
1
for /f "tokens=*" %%a in ('taskkill /F /FI "WINDOWTITLE eq Безымянный - Блокнот" /t') do echo %%a| find /i "отсутсвуют." && set result=KILL_ERROR
Но и эта конструкция не работает.
Как получить результат: был ли завершен процесс или нет?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2016, 09:51
Ответы с готовыми решениями:

Запрос подтверждения применения команды TASKKILL, завершающей определённый процесс
Можно ли сделать так, что бы при попытке закрытия процесса командой taskkill, сначала вылетал...

Не работает bat-файл, выполняющий команды TASKKILL и REG DELETE
Программа запускается и добавляется ключ в автозагрузку посредством батника start...

Получение консольной команды
Подскажите как можно получить консольную команду заданную к приложению: test.jad +ip +port то есть...

Получение системной информации через использование команды CPUID
Добрый день, очень нужна помощь с задачей: Получение системной информации через использование...

13
4335 / 2125 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
09.03.2016, 11:15 2
Вы не совсем правильно подходите к задаче, попробуйте с этой стороны:
Windows Batch file
1
2
3
4
5
@Echo Off
SetLocal EnableExtensions
Set ProcessName=notepad.exe
TaskList /FI "ImageName EQ %ProcessName%" | Find /I "%ProcessName%"
If %ErrorLevel% NEQ 0 Start %windir%\%ProcessName%
.

Добавлено через 3 минуты
Надо будет в пятой строке, если есть процесс убить и запустить новый, если нет просто запустить.

Добавлено через 3 минуты
А еще возможно оба процесса взаимосвязаны, тут надо думать. А первый процесс без проблем завершается принудительно? Бывает что не хочет или не сразу?

Добавлено через 14 минут
Как-то для себя такое делал:
Windows Batch file
1
2
3
4
5
@echo off
set "p=regedit.exe"
start "" "regedit.exe"
cmd /c for /l %%i in () do for /f delims^^=^^" %%j in ('tasklist /fi "imagename eq %p%" /fo csv /nh') do if not "%%j"=="%p%" rem:>Privet.txt
exit
Здесь идет запуск процесса (реестра в данном случае) и постоянно висит (работает) cmd с проверкой наличия процесса. Как только процесс пропал (завершился или завершили) будет создан документ Privet.txt. Но нагрузка на процессор огромнейшая, поэтому использовать такое есть смысл для очень узкого временного диапазона работы запущенного процесса.
0
4 / 4 / 2
Регистрация: 30.11.2015
Сообщений: 29
09.03.2016, 11:16  [ТС] 3
То есть вы предлагаете мне сначала найти (или не найти) скрипт в запущенных приложениях и, в случае успеха - убить его? Дело в том, что это работает на очень слабой машине. И хотелось бы минимизировать время между запуском нового скрипта и завершением предыдущего. Поэтому и вписал
Windows Batch file
1
taskkill /F /FI "WINDOWTITLE eq Администратор:  MY_SCRIPT" /t
без всяких условий.
0
4335 / 2125 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
09.03.2016, 13:51 4
Я предлагал перед запуском нового процесса делать проверку на ненужный сейчас:
Windows Batch file
1
2
3
4
@echo off
set "pname=notepad.exe
tasklist /fi "imagename eq %pname%" | find /i "%pname%" && echo.Ждем окончания процесса? || echo.Запустить новый процесс?
pause>nul
,
иначе я просто не понимаю что Вы хотите.
0
4 / 4 / 2
Регистрация: 30.11.2015
Сообщений: 29
09.03.2016, 15:17  [ТС] 5
Цитата Сообщение от alpap Посмотреть сообщение
иначе я просто не понимаю что Вы хотите.
Я хочу знать результат выполнения команды
Windows Batch file
1
taskkill /F /FI "WINDOWTITLE eq Администратор:  MY_SCRIPT" /t
Был ли завершен, работавший скрипт или нет. Задача стоит именно такая. Ожидать завершения работы скрипта не выход: он иногда зависает. Есть и другие причины, которые не позволяют продлить выполнение скрипта (в том случае если он не завис, а просто работает чуть дольше). Ему выделено время работы от его запуска до запуска следующего скрипта по графику.
0
4335 / 2125 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
10.03.2016, 12:32 6
Цитата Сообщение от Upszn1449 Посмотреть сообщение
Был ли завершен, работавший скрипт или нет
- Вы меня не слышите.
Цитата Сообщение от Upszn1449 Посмотреть сообщение
он иногда зависает. Есть и другие причины, которые не позволяют продлить выполнение скрипта
- надо разбираться в других причинах, а
Цитата Сообщение от Upszn1449 Посмотреть сообщение
Я хочу знать результат выполнения команды
, даже. если и сумеете как-то из вашей команды определить (не представляю как), то можете большими красными буквами написать результат на стене, так как больше он ни для чего не нужен.
0
4 / 4 / 2
Регистрация: 30.11.2015
Сообщений: 29
10.03.2016, 17:43  [ТС] 7
Цитата Сообщение от alpap Посмотреть сообщение
- Вы меня не слышите.
Возможно, я не совсем понял ваше сообщение #4, разъясните, пожалуйста подробно.
Давайте начну с начала. Вообще-то, это мне нужно, только для того, чтобы отловить один баг. Дело в том, что время от времени происходит одна и та же ошибка (в одном и том же месте выполнения скрипта, но не в том месте, о котором идет речь по ссылке выше; я с помощью OpenHardwareMonitorReport получаю температуру процессора)
Вот код:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
:HARDWARE
ECHO Идет получение параметров оборудования.
for /F "usebackq skip=3 tokens=8 delims= " %%a in (`"wmic path Win32_PerfFormattedData_PerfOS_Processor"`) do set LoadCPUwmic=%%a
CALL :TIMENOWIS
::errorcount - количество предущих неудачных проверок
>"c:\Program Files\smscontrol\status.log" ECHO 510 %timenow% %errorcount%
set counter=0
for /f "usebackq tokens=*" %%E IN (`d:\Install\OpenHardwareMonitorReport_new\OpenHardwareMonitorReport.exe`) DO (
  set /a counter=!counter!+1
   if !counter!==16 (
   for /f "usebackq tokens=7,8" %%G IN ('%%E') DO set Tcpu0=%%G & set Tcpu1=%%H
   CALL :TIMENOWIS
>"c:\Program Files\smscontrol\status.log" ECHO 520 %timenow% %errorcount%
   )
   if !counter!==17 (
   for /f "usebackq tokens=7,8" %%G IN ('%%E') DO set Lcpu0=%%G & set Lcpu1=%%H
   CALL :TIMENOWIS
>"c:\Program Files\smscontrol\status.log" ECHO 530 %timenow% %errorcount%
   )
   if !counter!==20 (
   for /f "usebackq tokens=7" %%G IN ('%%E') DO set Lram0=%%G
   CALL :TIMENOWIS
>"c:\Program Files\smscontrol\status.log" ECHO 540 %timenow% %errorcount%
   )
)
 
set Tcpu0=%Tcpu0:~0,3%
set Tcpu0=%Tcpu0: =%
set Tcpu0=%Tcpu0:.=%
set Tcpu1=%Tcpu1:~0,3%
set Tcpu1=%Tcpu1: =%
set Tcpu1=%Tcpu1:.=%
set Lcpu0=%Lcpu0:~0,3%
set Lcpu0=%Lcpu0: =%
set Lcpu0=%Lcpu0:.=%
set Lcpu1=%Lcpu1:~0,3%
set Lcpu1=%Lcpu1: =%
set Lcpu1=%Lcpu1:.=%
set Lram0=%Lram0:~0,3%
set Lram0=%Lram0: =%
set Lram0=%Lram0:.=%
 
::Это я делаю для того, чтобы отформатировать вывод в файл
set spclcpu1=
if %LoadCPUwmic% LEQ 99 (
set spclcpu1=
if %LoadCPUwmic% LEQ 9 (
set spclcpu1= 
)
)
CALL :TIMENOWIS
>"c:\Program Files\smscontrol\status.log" ECHO 550 %timenow% %errorcount%
ECHO Параметры оборудования получены.
ECHO T1=%Tcpu0% T2=%Tcpu1% Lcpu1=%LoadCPUwmic% Lcpu2=%Lcpu0% Lcpu3=%Lcpu1% Lram=%Lram0%
set hard= %Tcpu1% %LoadCPUwmic%%spclcpu1% %Lcpu0% %Lcpu1% %Lram0%
set hardENG= T1=%Tcpu0% T2=%Tcpu1% Lcpu1=%LoadCPUwmic%%spclcpu1% Lcpu2=%Lcpu0% Lcpu3=%Lcpu1% Lram=%Lram0%
 
:TEMPERAT
if %Tcpu1% GTR 80 (
set res=. ВНИМАНИЕ. Превышение температуры %Tmax%
set hard= OVERHEAT=%Tcpu1% %LoadCPUwmic% %Lcpu0% %Lcpu1% %Lram0%
goto SMS
)
:TIMENOWIS
set year=%DATE:~8,2%
SET nt=%TIME:~0,8%
SET nt=%nt: =0%
set timenow=%DATE:~0,6%%year% %nt%
exit /b

Причем, интересно, эта ошибка скорее всего, возникает только тогда, когда скрипт запускается строго в определенную минуту часа
Уточню:
Немного уточню, скрипт запускается планировщиком каждые три минуты, начиная с 00:00:00, то есть на 00, 03, 06, 09 и т. д. минуте каждого часа, и вот, очередной скрипт сообщает мне, Last check ERROR=550 09.03.16 17:16:52 0 fix error 09.03.16 17:18:01, потом следующее сообщение Last check ERROR=550 09.03.16 22:16:57 0 fix error 09.03.16 22:18:01, и еще Last check ERROR=550 10.03.16 05:16:58 0 fix error 10.03.16 05:18:01 - Это реальный лог работы. Через некоторое время минута, в которую запущен скрип, может поменяться. В нормальном режиме время работы всего скрипта 60-70 секунд.
Поэтому первое, что пришло в голову - это в первую очередь понять, завис ли скрипт и был завершен следующим или завершился с ошибкой сам.
Вот как-то так.
0
4335 / 2125 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
10.03.2016, 18:11 8
Если это полный код, то не хватает первой строкой
Windows Batch file
1
SetLocal EnableDelayedExpansion
, для правильного раскрытия переменных в !var!. Какой формат времени у Вас, у меня, например, нет первого 0, к примеру 09:00 у меня 9:00, если так же, то
Windows Batch file
1
SET nt=%nt: =0%
не нужно. Подобные выражения лучше записывать так:
Windows Batch file
1
set "res=. ВНИМАНИЕ. Превышение температуры %Tmax%"
. А вот конкретного объяснения или самой проблемы что-то не понял пока.
0
4 / 4 / 2
Регистрация: 30.11.2015
Сообщений: 29
10.03.2016, 18:25  [ТС] 9
1. Нет, это, конечно, не полный код. Да ранее в коде отложенное раскрытие переменных включено
2. Вывод времени в командной строке у меня без первого нуля, а мне он нужен (хотя бы для красивого форматирования, дальнейших математических действий со значением часов не провожу).
3. Проблема в "ошибке 550", нужно понять откуда она: зависает скрипт или завершается с ошибкой, о которой я давал ссылку, и, разумеется, исправить ее.
0
4335 / 2125 / 661
Регистрация: 26.04.2015
Сообщений: 6,823
10.03.2016, 19:05 10
Upszn1449, А есть кусок кода, где построение по отношению к ошибке 550 или же это уже запрограммированная внутри утилиты. Чтобы точно понять со стороны это надо и утилиту ставить и на таких же ОС проверять, исходя из того что вижу вы явно берете во внимание не ту деталь. Уберите из планировщика, загоните в отдельный батник, поставьте на запуск на жесткое время и смотрите где проблема.
0
4 / 4 / 2
Регистрация: 30.11.2015
Сообщений: 29
10.03.2016, 19:52  [ТС] 11
Цитата Сообщение от alpap Посмотреть сообщение
кусок кода, где построение по отношению к ошибке 550
Не совсем понял. Вас интересует откуда берется значение ошибки 550 (см. тут - я сам записываю в лог этап, который прошел) или же как она потом обрабатывается?
Вот как:
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@ECHO OFF
title PWR_INET_KILL
 
taskkill /F /FI "WINDOWTITLE eq Администратор:  PWR_INET" /t
 
title PWR_INET
 
:SCRIPT
set /p stat=<"c:\Program Files\smscontrol\status.log"
CALL :TIMENOWIS
set starttimeerror=%timenow%
set error=%stat:~0,3%
set /a errorcount=%stat:~22,6%
 
CALL :TIMENOWIS
>"c:\Program Files\smscontrol\status.log" ECHO 100 %timenow% %errorcount%
set Tmax=80
set /a pingcount=100
set NEXTSTEP=GOTO HARDWARE
 
if %error% LEQ 010 (
cls
goto START
)
cls
goto SMSERROR
0
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 12
22.10.2018, 17:02 12
Коллеги, можно я буду некропостером?

Итак, есть задача перебирать айпижники, проверять наличие процесса и при его отсутствии его запускать. Там выше пример я взял за основу и родилось вот подобное:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@echo off
SetLocal EnableExtensions
Set ProcessName=notepad.exe
 
set IP=192.168.1.1
TaskList /s %IP% /FI "ImageName EQ %ProcessName%" | Find /I "%ProcessName%"
If %ErrorLevel% NEQ 0 psexec \\%IP% -d -s "%windir%\%ProcessName%"
 
set IP=192.168.1.2
TaskList /s %IP% /FI "ImageName EQ %ProcessName%" | Find /I "%ProcessName%"
If %ErrorLevel% NEQ 0 psexec \\%IP% -d -s "%windir%\%ProcessName%"
Подсовывая каждый раз IP у меня происходит перебор по сети и удалённый запуск notepad.exe (для примера )

Можно было бы так и оставить, но городить всё это для отдельного айпижнека, которых под 2 сотни этого не хочется и решил я собрать вот такую конструкцию:

Windows Batch file
1
2
3
4
5
6
7
8
@echo off
SetLocal EnableExtensions
Set ProcessName=notepad.exe
 
for %%x in (1 3 5 7) do for %%z in (1 2 3 4) do (
TaskList /s 192.168.%%x.%%z /FI "ImageName EQ %ProcessName%" | Find /I "%ProcessName%"
If %ErrorLevel% NEQ 0 psexec \\192.168.%%x.%%z -d -s "%windir%\%ProcessName%"
)
Т.е. просто вложил в 2 цикла, формирующие IP адреса (ну не придумал я другого способа задать массив и его перебирать), уже проверенно работающий поиск удалённого процесса и запуск процесса, НО! В этой конструкции у меня всегда %ErrorLevel% возвращается 0, независимо от того, запущен или нет искомый процесс на удалённом ПК. И вот тут я что-то подвис... Ладно бы TaslList не воспринимал /s 192.168.%%x.%%z, так нет - всё чётко перебирает по удалённым ПК процесс %ProcessName%, который он тоже вполне себе правильно находит или нет... Где я ошибся?
0
731 / 329 / 134
Регистрация: 17.03.2014
Сообщений: 827
22.10.2018, 20:50 13
Цитата Сообщение от GoFrenDiy Посмотреть сообщение
НО! В этой конструкции у меня всегда %ErrorLevel% возвращается 0
Windows Batch file
2
SetLocal EnableExtensions EnableDelayedExpansion
Windows Batch file
7
If !ErrorLevel! NEQ 0 psexec \\192.168.%%x.%%z -d -s "%windir%\%ProcessName%"
1
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 12
22.10.2018, 20:55 14
Ничего не понял. но ЗАРАБОТАЛО!

СПАСИБО!
0
22.10.2018, 20:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2018, 20:55
Помогаю со студенческими работами здесь

Получение значения ключевого поля после выполнения команды TableAdapter.Insert()
Использую типизированный датасет в котором заданы DataTable и TableAdapter к ним. Не могу понять...

Проверка %ERRORLEVEL%
Добрый день! Помогите пожалуйста. После запуска команды необходимо сделать проверку %ERRORLEVEL%....

Обработка значения ERRORLEVEL
Привет всем! Столкнулся с проблемой обработки значения errorlevel. Вызываю внешний скрипт call...

Аналог Errorlevel в Delphi
Добрый день. Подскажите как можно реализовать это действие в Delphi. Создается директория и если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru