Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2022, 17:08   #1
AleksandrB00
Пользователь
 
Регистрация: 30.05.2022
Сообщений: 37
Сообщение Задача из Brain Ping Kaspersky

В данном коде (bat файл) допущена ошибка, необходимо её исправить.

Код:
@Echo Off
Set ServiceName=dnscache
SC queryex %ServiceName%|Find "STATE"|Find "RUNNING">Nul&&(
Net stop %ServiceName%>nul||(
For /F "tokens=3" %%A In ('SC queryex %ServiceName%^|Find "PID"') Do (
TaskKill /F /T /PID %%A>nul
Ping -n 4 127.0.0.1>nul
)
Net stop %ServiceName% 2>nul
)
)
Net start %ServiceName%
Я так понимаю, что вместо Find "STATE" и Find "RUNNING" необходимо вытащить все процессы со статусом running, а в месте Find "PID" надо пройти циклом по procces_id и вырубить каждый.
Смог разобраться только с Find "STATE" и Find "RUNNING", а вот с PID не понятно.

Код:
@Echo Off
Set ServiceName=dnscache
SC queryex %ServiceName%|where {$_.status -eq 'running'} >Nul&&(
Net stop %ServiceName%>nul||(
For /F "tokens=3" %%A In ('SC queryex %ServiceName%') Do (
TaskKill /F /T /PID %%A>nul
Ping -n 4 127.0.0.1>nul
)
Net stop %ServiceName% 2>nul
)
)
Net start %ServiceName%
AleksandrB00 вне форума Ответить с цитированием
Старый 15.07.2022, 20:55   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Вот это должно помочь разобраться. Хотя мне почему-то нравится ^ в строке с for - уберите его совсем. И проверьте token=3: цифра PID в строке, которую возвращает sc queryex %ServiceName%|Find "PID" должна быть разделена 2 пробелами (3-им словом в строке). Далее по этой цифре будет убит процесс и перезапущен сервис dnscache.
macomics вне форума Ответить с цитированием
Старый 15.07.2022, 21:59   #3
AleksandrB00
Пользователь
 
Регистрация: 30.05.2022
Сообщений: 37
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Вот это должно помочь разобраться. Хотя мне почему-то нравится ^ в строке с for - уберите его совсем. И проверьте token=3: цифра PID в строке, которую возвращает sc queryex %ServiceName%|Find "PID" должна быть разделена 2 пробелами (3-им словом в строке). Далее по этой цифре будет убит процесс и перезапущен сервис dnscache.
К сожалению не особо разбираюсь в синтаксисе .bat файлов, но попытался воспроизвести с вашими правками (не понял, к какому коду они были, к моему или к исходному)
при запуске моего кода с учётом правок
Код:
@Echo Off
Set ServiceName=dnscache
SC queryex %ServiceName% | where {$_.status -eq 'running'}>Nul&&(
Net stop %ServiceName%>nul||(
For /F "tokens=3" %%A In ('SC queryex %ServiceName%' | Find "PID" ) Do (
TaskKill /F /T /PID %%A>nul
Ping -n 4 127.0.0.1>nul
)
Net stop %ServiceName% 2>nul
)
)
Net start %ServiceName%
терминал пишет следующее "Непредвиденное появление: |."
Если использовать исходный код с учётом правок, то терминал выводит тоже самое.
Если же запускать исходный код без изменений, то терминал выводит следующее
Код:
Find: ‘STATE’: No such file or directory
Find: ‘RUNNING’: No such file or directory
Поэтому я и решил отсортировать STATE И RUNNING с помощью where, и если я всё правильно понимаю, то остаётся вопрос "Как пройти циклом по "PID"(он же process id)?"

Последний раз редактировалось AleksandrB00; 15.07.2022 в 22:03.
AleksandrB00 вне форума Ответить с цитированием
Старый 15.07.2022, 22:11   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так просто выполните в командной строке нужную команду
Код:
for /F "tokens=3" %A in ('SC queryex dnscache | Find "PID"') do echo %A
Должно появиться число (PID) процесса, который в исходном скрипте потом подставляется в команду taskkill /F /T /PID %%A>nul (вместо %%A)
macomics вне форума Ответить с цитированием
Старый 15.07.2022, 22:15   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Еще лучше измените в bat файле @echo off на @echo on или на rem @echo off. В конце допишите pause, чтобы не закрывалось автоматически.
Тогда будете видеть результаты работы команд в командной строке

ADD:
Код:
rem @Echo Off

rem Установка значения переменной ServiceName в значение dnscache.
rem Далее по тексту значения %ServiceName% будут заменяться на dnscache
Set ServiceName=dnscache

rem Запрос статуса сервиса dnscache
rem  | Find "STATE" ищет в статусе строку со словом STATE
rem  | Find "RUNNING" ищет в строке статуса слово RUNNING
rem если слово RUNNING в строке статуса появилось, тогда выполняется  текст в скобках
SC queryex %ServiceName%|Find "STATE"|Find "RUNNING">Nul&&(

rem Попытка остановки сервиса dnscache
rem Если она была не удачной, тогда выполняется текст в скобках
    Net stop %ServiceName%>nul||(

rem Это по сути не цикл, а команда поиска слова в строке
rem Выполняется команда SC queryex dnscache и ее результат отправляется в команду
rem  |Find "PID", которая ищет в тексте строку со словом PID. Эту строку и разбирает
rem цикл for, предполагая, что 3-е слово в строке это число - PID нужного процесса
rem Если разобрать строку удалось и token=3 присутствует, тогда выполняется текст в скобках
rem В этой команде присутствовал символ ^ - мне он понравился и я решил, что лучше, чтобы
rem его не было на своем месте. Я отредактировал эту команду - она должна сработать правильно
rem Единственное в чем я не уверен это в порядке слов строки. Для этого выше я привел команду проверки.
        For /F "tokens=3" %%A In ('SC queryex %ServiceName%|Find "PID"') Do (

rem Команда безжалостно убивает процесс с PID %%A - вместо которой будет подставлено число
rem найденное for в строке результата работы команды
            TaskKill /F /T /PID %%A>nul

rem Это для небольшой задержки в несколько сотых секунды, чтобы процесс успел отдать kernel душу
            Ping -n 4 127.0.0.1>nul
        )

rem Это уже команда будет выполнена даже если цикл не выполнялся (тело цикла закончилось)
rem Еще одна попытка остановить сервис dnscache
        Net stop %ServiceName% 2>nul
    )
)

rem В конце концов запускаем сервис dnscache
Net start %ServiceName%

Последний раз редактировалось macomics; 15.07.2022 в 23:01.
macomics вне форума Ответить с цитированием
Старый 15.07.2022, 22:54   #6
AleksandrB00
Пользователь
 
Регистрация: 30.05.2022
Сообщений: 37
По умолчанию

Результат тот же
Код:
Непредвиденное появление: |.
по поводу echo читал и пробовал, думаю проблема именно в обращении к PID
AleksandrB00 вне форума Ответить с цитированием
Старый 15.07.2022, 23:05   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тогда попробуйте так
Код:
for /F "usebackq tokens=3" %%A in (`sc %ServiceName%^|Find "PID"`) do (
Исправил. Все же ^ нужен. Должно работать как надо.

Последний раз редактировалось macomics; 15.07.2022 в 23:14.
macomics вне форума Ответить с цитированием
Старый 15.07.2022, 23:54   #8
AleksandrB00
Пользователь
 
Регистрация: 30.05.2022
Сообщений: 37
По умолчанию

Огромное спасибо за такое подробное описание работы. Но всё ещё выходит
Код:
Find: ‘STATE’Find: :No such file or directory
Я понимаю, что
Код:
&&
означает начало выполнения команды, только если предыдущее выражение завершилось успешно, соответственно можно сделать вывод, что обращение к
Код:
"STATE" и "RUNNING"
неверное.
И суть самой задачи в том, чтобы данная служба dnscache завершила работу и заново запустилась, но в конце всех попыток я получаю сообщение
Код:
Затребованная служба уже запущена.
Так как
Код:
Net start %ServiceName%
отрабатывает уже после неудачного запуска файла, соответственно dnscache так и не умерла.
Также пробовал играть со значением
Код:
"tokens=3"
менял его значение во всех вариациях кода в диапазоне от 1 до 10 (хотя если правильно понимаю оно не может быть больше 4 в данном случае)

Последний раз редактировалось AleksandrB00; 15.07.2022 в 23:58.
AleksandrB00 вне форума Ответить с цитированием
Старый 16.07.2022, 01:27   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от AleksandrB00 Посмотреть сообщение
означает начало выполнения команды, только если предыдущее выражение завершилось успешно, соответственно можно сделать вывод, что обращение к
Код:

"STATE" и "RUNNING"

неверное.
Нет. Тут идет фильтрация. Сначала из всего текста, который выдаст команда SC queryex dnscache оставляется только строка(и) которые содержат слово STATUS, чтобы не было ошибок в реакции на другие значения. Потом статус проверяется на состояние RUNNING.
Цитата:
Сообщение от AleksandrB00 Посмотреть сообщение
Так как
Код:

Net start %ServiceName%

отрабатывает уже после неудачного запуска файла, соответственно dnscache так и не умерла.
Также пробовал играть со значением
Код:

"tokens=3"

менял его значение во всех вариациях кода в диапазоне от 1 до 10 (хотя если правильно понимаю оно не может быть больше 4 в данном случае)
Не надо с ним играться в bat файле. Достаточно просто использовать команду прямо в консоли
Код:
for /F "usebackq tokens=3" %A in (`SC queryex dnscache^|Find "PID"`) do echo %A
Убедиться, что в консоль выводится число, которое равно PID нужного процесса. А потом подставить это в bat файл.
macomics вне форума Ответить с цитированием
Старый 16.07.2022, 13:38   #10
AleksandrB00
Пользователь
 
Регистрация: 30.05.2022
Сообщений: 37
По умолчанию

Правильно ли я понимаю, что данный код надо запустить в PowerShell
Код:
for /F "usebackq tokens=3" %A in (`SC queryex dnscache^|Find "PID"`) do echo %A
Если да, то выдаёт следующее
Код:
строка:1 знак:4
+ for /F "usebackq tokens=3" %A in (`SC queryex dnscache^|Find "PID"`)  ...
+    ~
Отсутствует открывающий знак "(" после ключевого слова "for".
строка:1 знак:80
+ ... ebackq tokens=3" %A in (`SC queryex dnscache^|Find "PID"`) do echo %A
+                                                                          ~
Отсутствует закрывающий знак ")" в выражении.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingOpenParenthesisAfterKeyword
AleksandrB00 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт/Подмена DLL (Brain->Вынос) coNsept Общие вопросы C/C++ 1 26.07.2011 01:53
Kaspersky 7.0.0.125 tsergey Безопасность, Шифрование 2 27.02.2009 11:54
Kaspersky Elm0 Свободное общение 11 05.06.2007 11:29