Bat файл проверка запущена ли программа
Не так давно ко мне обратились за помощью в реализации такого костыля.
Чтобы он мониторил через какое-то время процесс и если он не запущен автоматически запускал.
первый вариант выглядел вот таким образом:
:proverka
tasklist | find "mspaint.exe"
if %ERRORLEVEL% EQU 1 goto restart
if %ERRORLEVEL% EQU 0 goto vremya
:vremya
timeout 10
goto proverka
:restart
start %windir%\system32\mspaint.exe
goto proverka
Данный код при запуске проверял через команду tasklist запущен или нет процесс под таким именем.
Если ответ был отрицательным то он переходит на функцию :restart и запускает нужный процесс и переходит на функцию :proverka для повторной проверки о состоянии данного процесса.
Если ответ был положительным то он переходит на функцию :vremya и ждет указанное количество секунд после переходит на функцию :proverka и далее по кругу.
У данного кода проблема в том что окно командной строки всегда виден.
Вечером немного подумал и решил bat скрипт довести до ума и скрыть назойливое окно и запускать уже автоматом скрытый процесс.
Для этого сначала создаем bat файл который добавит данную мини программу в планировщик windows.
В нем будет одна команда хотя её можно и ввести в командную строку. Лично для меня через bat файл проще.
schtasks /Create /SC minute /mo 1 /TN win /TR c:\processmonitor.exe
Самое важное в данном коде это параметр /mo 1 значения отвечают за то что программа будет исполняться каждую минуту.
изменяем на ваше усмотрение.
Дальше берем первый код и убираем лишнее и создаем файл processmonitor.bat с кодом.
tasklist | find "mspaint.exe"
if %ERRORLEVEL% EQU 1 goto restart
:restart
start %windir%\system32\mspaint.exe
Теперь осталось только файл processmonitor.bat конвертировать в exe и скрыть окно командной строки.
Данную процедуру описывал вот тут Конвертировать bat файл в exe.
На этом все пользуйтесь кому нужно не забываем коментировать, задавать вопросы и делиться с друзьями.
How can I check if an application is running from a batch (well cmd) file?
I need to not launch another instance if a program is already running. (I can't change the app to make it single instance only.)
Also the application could be running as any user.
19 Answers 19
Another possibility I came up with, which does not require to save a file, inspired by using grep is:
- /fi "" defines a filter of apps to find, in our case it's the *.exe name
- /fo csv defines the output format, csv is required because by default the name of the executable may be truncated if it is too long and thus wouldn't be matched by find later.
- find /I means case-insensitive matching and may be omitted
See the man page of the tasklist command for the whole syntax.
this worked for me nicely (windows XP SP3). IMHO this is the most elegant way of all proposed here, using just the tools shipped with windows
I had syntax problem with this command line. I changed it to tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL / if %ERRORLEVEL%==1 goto wordnotrunning in order to make it works (suspecting the quote around the if parts
Please remember that in other language versions of XP the filter names were translated in code but not but in help /? screen. So for example IMAGENAME in polish version is NAZWA_OBRAZU .
Under Win7 I had to change it to tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL The first NUL seems unnecessary, I have no idea what the '2' is for, the /NH is optional.
tasklist always exits with status 0 whether or not it finds any matching tasks, which is why it's useless on its own. Since you have to use find (or findstr) to check its output anyway, there's no point using tasklist's filters. Just do tasklist | find "myprog.exe" >nul: && goto foundit or somesuch. You might need the /v (verbose) option to tasklist.
Here's how I've worked it out:
The above will open Notepad if it is not already running.
Edit: Note that this won't find applications hidden from the tasklist. This will include any scheduled tasks running as a different user, as these are automatically hidden.
Changing the tasklist format to CSV or anything but table is important because it tasklist default layout (table) truncates long image names which breaks the logic.
This solution will not work on Vista because TASKLIST produces some output even if the process is not found. I presume the same is true for Windows 7.
does not work in Windows 10. search.log contains "INFO: No tasks are running which match the specified criteria." and no notepad is started
I like Chaosmaster's solution! But I looked for a solution which does not start another external program (like find.exe or findstr.exe). So I added the idea from Matt Lacey's solution, which creates an also avoidable temp file. At the end I could find a fairly simple solution, so I share it.
This is working for me nicely.
The above is an edit. The original code apparently had a GOTO in it, which someone in the comments thought uncouth.
Spaces
If you are concerned that the program name may have spaces in it then you need to complicate the code very slightly:
The original code will work fine whether or not other running processes have spaces in their names. The only concern is whether or not the process we are targeting has space(s).
Keep in mind that if you add an ELSE clause then it will be executed once for every instance of the application that is already running. There is no guarantee that there be only a single instance running when you run this script.
Should you want one anyway, either a GOTO or a flag variable is indicated.
Ideally the targeted application should already mutex itself to prevent multiple instances, but that is a topic for another SO question and is not necessarily applicable to the subject of this question.
GOTO again
I do agree with the "ELSE" comment. The problem with the GOTO-less solution, that is may run the condition part (and the ELSE part) multiple times, so it is a bit messy as it has to quit the loop anyway. (Sorry, but I do not deal with the SPACE issue here, as it seems to be pretty rare and a solution is shown for it)
@LordScree As I work on un*x systems case sensitivity is good for me! I even set the file system to enable case sensitive file names. ;)
This doesn't work if the application has a space in the name as %x ends up being part of the application name up to the first space.
A possible solution would be to check if the application is not found instead by checking if %x == INFO: but I don't know which versions of Windows this would work on or if there's a better solution.
The suggestion of npocmaka to use QPROCESS instead of TASKLIST is great but, its answer is so big and complex that I feel obligated to post a quite simplified version of it which, I guess, will solve the problem of most non-advanced users:
The code above was tested in Windows 7, with a user with administrator rigths.
I must say that unlike this command, the tasklist solutions not only look too complicated for such a simple query, but they also run a second or so and use tons of cpu! This is much better, also worked with no admin permissions (Windows Server 2012).
This seems to be the simplest and best solution (at least for me) as it works as-is when the application has spaces in the name. I'm curious what the limitations of this solution are and why it doesn't have more votes.
Under Windows you can use Windows Management Instrumentation (WMI) to ensure that no apps with the specified command line is launched, for example:
wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)
Note that WMIC requires administrative privileges; if you don't have it, then Only the administrator group members can use WMIC.EXE. followed by Reason:Win32 Error: Access is denied.
i think this is best solution, because wmic gives you a complete command line launched and milion other informations.
TrueY's answer seemed the most elegant solution, however, I had to do some messing around because I didn't understand what exactly was going on. Let me clear things up to hopefully save some time for the next person.
TrueY's modified Answer:
Anyway, I hope that helps. I know sometimes reading batch/command-line can be kind of confusing sometimes if you're kind of a newbie, like me.
this works for me on windows 7. 2nd line is the directory that contains the program, not the program itself.
The answer provided by Matt Lacey works for Windows XP. However, in Windows Server 2003 the line
INFO: No tasks are running which match the specified criteria.
which is then read as the process is running.
I don't have a heap of batch scripting experience, so my soulution is to then search for the process name in the search.log file and pump the results into another file and search that for any output.
I hope this helps someone else.
I like the WMIC and TASKLIST tools but they are not available in home/basic editions of windows.Another way is to use QPROCESS command available on almost every windows machine (for the ones that have terminal services - I think only win XP without SP2 , so practialy every windows machine):
QPROCESS command is not so powerful as TASKLIST and is limited in showing only 12 symbols of process name but should be taken into consideration if TASKLIST is not available.
More simple usage where it uses the name if the process as an argument (the .exe suffix is mandatory in this case where you pass the executable name):
The difference between two ways of QPROCESS usage is that the QPROCESS * will list all processes while QPROCESS some.exe will filter only the processes for the current user.
Using WMI objects through windows script host exe instead of WMIC is also an option.It should on run also on every windows machine (excluding the ones where the WSH is turned off but this is a rare case).Here bat file that lists all processes through WMI classes and can be used instead of QPROCESS in the script above (it is a jscript/bat hybrid and should be saved as .bat ):
And a modification that will check if a process is running:
The two options could be used on machines that have no TASKLIST .
The ultimate technique is using MSHTA . This will run on every windows machine from XP and above and does not depend on windows script host settings. the call of MSHTA could reduce a little bit the performance though (again should be saved as bat):
Как я могу проверить, запущено ли приложение из пакетного (хорошо cmd) файла?
Мне не нужно запускать другой экземпляр, если программа уже запущена. (Я не могу изменить приложение, чтобы сделать его только один экземпляр.)
Также приложение может работать как любой пользователь.
Еще одна возможность, которую я придумал, вдохновленная использованием grep :
Не нужно сохранять дополнительный файл, поэтому я предпочитаю этот метод.
это работало для меня хорошо (Windows XP SP3). ИМХО, это самый элегантный способ из всех предложенных здесь, с использованием только инструментов, поставляемых с Windows
У меня была проблема с синтаксисом этой командной строки. Я изменил его на tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL / if %ERRORLEVEL%==1 goto wordnotrunning для того, чтобы заставить его работать (подозревая цитату вокруг частей if
Помните, что в других языковых версиях XP имена фильтров были переведены в код, но не в /? экран справки . Так, например, IMAGENAME в польской версии есть NAZWA_OBRAZU .
Под Win7 мне пришлось поменять его на tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL Первый NUL кажется ненужным, я понятия не имею, для чего нужен «2», / NH не обязателен.
список задач всегда выходит со статусом 0 независимо от того, находит ли он какие-либо подходящие задачи, поэтому он сам по себе бесполезен. Поскольку вы все равно должны использовать find (или findstr) для проверки его вывода, нет смысла использовать фильтры списка задач. Просто сделай список задач | найти "myprog.exe"> nul: && goto foundit или somesuch. Вам может понадобиться параметр / v (подробный) для списка задач.
Вот как я это сделал:
Приведенное выше откроет Блокнот, если он еще не запущен.
Изменить: Обратите внимание, что это не найдет приложения, скрытые от списка задач. Это будет включать любые запланированные задачи, выполняемые от имени другого пользователя, поскольку они автоматически скрываются.
Изменение формата списка задач на CSV или на что угодно, кроме таблицы, важно, потому что это макет (таблица) списка задач по умолчанию усекает длинные имена изображений, что нарушает логику.
Это решение не будет работать в Vista, потому что TASKLIST производит некоторые выходные данные, даже если процесс не найден. Я предполагаю, что то же самое верно для Windows 7.
не работает в Windows 10. search.log содержит «INFO: не выполняются задачи, соответствующие указанным критериям». и блокнот не запускается
Мне нравится решение Chaosmaster! Но я искал решение, которое не запускает другую внешнюю программу (например, find.exe или findstr.exe ). Поэтому я добавил идею из решения Мэтта Лейси, которое создает временный файл, которого можно избежать. В конце я смог найти довольно простое решение, поэтому я поделился им .
Это хорошо работает для меня .
@LordScree Поскольку я работаю в un * x системах, чувствительность к регистру мне подходит! Я даже установил файловую систему, чтобы включить имена файлов с учетом регистра. ;)
Это не работает, если в имени приложения есть пробел, так как% x оказывается частью имени приложения до первого пробела.
Возможным решением было бы проверить, не найдено ли приложение, вместо этого, проверив% x == INFO: но я не знаю, на каких версиях Windows это будет работать или есть лучшее решение.
Предложение npocmaka использовать QPROCESS вместо TASKLIST велико, но его ответ настолько велик и сложен, что я чувствую себя обязанным опубликовать довольно упрощенную версию, которая, я думаю, решит проблему большинства неопытных пользователей:
Приведенный выше код был протестирован в Windows 7 с пользователем с правами администратора.
Я просто использовал эту идею, чтобы дважды остановить автоматизированный процесс, и это сработало как шарм!
Должен сказать, что в отличие от этой команды, решения для списка задач не только выглядят слишком сложными для такого простого запроса, но и запускают примерно секунду и используют тонны процессора! Это намного лучше, также работает без прав администратора (Windows Server 2012).
Это, кажется, самое простое и лучшее решение (по крайней мере для меня), поскольку оно работает как есть, когда в имени приложения есть пробелы. Мне любопытно, каковы ограничения этого решения и почему у него нет больше голосов.
В Windows вы можете использовать инструментарий управления Windows (WMI), чтобы убедиться, что не запущены приложения с указанной командной строкой, например:
wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)
Обратите внимание, что WMIC требует административных привилегий; если у вас его нет, а Only the administrator group members can use WMIC.EXE. затем Reason:Win32 Error: Access is denied.
я думаю, что это лучшее решение, потому что wmic дает вам полную запущенную командную строку и предоставляет другую информацию .
Это на самом деле прекрасно работает. Просто! Только знайте, что это чувствительно к регистру, если вы не добавите /i .
это работает для меня в Windows 7. 2-я строка - это каталог, в котором находится программа, а не сама программа.
Ответ TrueY показался мне самым элегантным решением, однако мне пришлось немного повозиться, потому что я не понимал, что именно происходит. Позвольте мне все прояснить, чтобы сэкономить время для следующего человека.
Измененный ответ TrueY:
Во всяком случае, я надеюсь, что это помогает. Я знаю, что иногда чтение пакетной / командной строки может сбивать с толку, если вы новичок, как я.
Ответ предоставляется Matt Lacey работает для Windows XP. Однако в Windows Server 2003 строка
ИНФОРМАЦИЯ: Не выполняются задачи, соответствующие указанным критериям.
который затем читается при запуске процесса.
У меня нет опыта работы с пакетными сценариями, поэтому мое решение состоит в том, чтобы затем искать имя процесса в search.log файле и закачивать результаты в другой файл и искать его для любого вывода.
Я надеюсь, что это помогает кому-то еще.
Я вроде WMIC и TASKLIST инструментов , но они не доступны в доме / основные изданиями windows.Another способа является использование QPROCESS команд доступны на почти каждое окно машины (для тех , которые имеют терминальные услуги - Я думаю , что только выиграть XP без SP2, так practialy каждого окна машины):
QPROCESS Команда не настолько мощна, как TASKLIST и ограничена отображением только 12 символов имени процесса, но ее следует учитывать, если TASKLIST она недоступна.
Более простое использование, когда в качестве аргумента используется имя процесса ( .exe суффикс является обязательным в этом случае, когда вы передаете имя исполняемого файла):
Разница между двумя способами QPROCESS использования заключается в том, что QPROCESS * будут перечислены все процессы, в то время как QPROCESS some.exe будут фильтроваться только процессы для текущего пользователя.
Использование WMI объектов через exe- WMIC файл сценария Windows вместо этого также является опцией. Его следует запускать также на каждой машине Windows (исключая те, где WSH выключен, но это редкий случай). Здесь находится файл bat, в котором перечислены все процессы через WMI классы и могут использоваться вместо QPROCESS приведенного выше сценария (это гибрид jscript / bat и должен быть сохранен как .bat ):
И модификация, которая проверит, запущен ли процесс:
Два варианта могут быть использованы на машинах, которые не имеют TASKLIST .
Конечная техника использует MSHTA . Это будет работать на каждой машине с Windows от XP и выше и не зависит от настроек хоста скрипта Windows. MSHTA хотя вызов может немного снизить производительность (опять же следует сохранить как bat):
Я хочу написать командный файл, который выполняет следующие операции:
- Проверьте, запущена ли служба
- Если он запущен, выйдите из партии
- Если он не запущен, запустите службу
Примеры кода, которые я искал в Google, оказались неработоспособными, поэтому я решил не публиковать их.
Запуск службы осуществляется:
- Как я могу проверить, запущена ли служба, и как сделать оператор if в пакетном файле?
- Я немного запутался. Какой аргумент я должен передать чистому старту? Название сервиса или его отображаемое имя?
@Peter Schuetze: Да, ваше возражение правильное, если единственной целью является запуск службы. Я также включил ведение журнала и так далее, поэтому я придерживался решения lc.
Чтобы проверить состояние службы, используйте sc query . Информацию о блоках if в пакетных файлах см. В документации .
Следующий код проверит состояние службы MyServiceName и запустит ее, если она не запущена (блок if будет выполнен, если служба не запущена):
Объяснение того, что он делает:
- Запрашивает свойства службы.
- Ищет строку, содержащую текст "СОСТОЯНИЕ"
- Токенизирует эту строку и извлекает третий токен, который содержит состояние службы.
- Проверяет результирующее состояние по строке "RUNNING"
Что касается вашего второго вопроса, аргумент, который вы захотите передать, net start - это имя службы, а не отображаемое имя.
Потрясающие. Спасибо за ваши усилия. К сожалению, не работает? Может, я слишком глуп для этого. Я заменил «MyServiceName» на «SCardSvr» (экранированный) в качестве теста, поместил все в пакетный файл, выполнил его, но служба не запускается. Даже если я заменю net start чем-то другим, например печатью в файл, он не будет выполнен. Не могли бы вы взглянуть еще раз? =)
Ой, у меня там в первой строке было кое-что лишнее . Попробуй. И если это не сработает, что произойдет, если вы запустите sc query "SCardSvr" из командной строки?
@LittleBobbyTables: Вы правы. Без кавычек заставил работать. Я такой тупой: - | Спасибо за вашу помощь
@Mark Приятно отметить. Думаю, вам придется заменить эту строку на то, что нужно для языка целевой ОС. Я тоже предполагаю "БЕГ".
Для переключения службы используйте следующее:
NET START «Координатор распределенных транзакций» || NET STOP «Координатор распределенных транзакций»
Работает из-за кода выхода с самого начала. Если команда запуска не работает, вероятно, потому, что она уже запущена (и в любом случае ее последующая остановка не повредит), поэтому вы пытаетесь ее остановить.
команда построена таким образом, что если net start завершается неудачно, она затем останавливает ее (из-за символа ||, что означает else), но если net start выполняется, то net stop не выполняется. молодец!
На мой взгляд, это лучший ответ, и, возможно, @citronas стоит подумать о том, чтобы пометить его как принятый: простой, умный и элегантный, который подходит для такого сайта, как StackOverflow. Сделай это проще!
Не быть nitpicky (ОК, может быть , только немного), но || на самом деле является OR оператором, хотя в данном случае это функционально ELSE заявление. Это тонкое, но важное отличие. У меня все еще есть +1 - я все время делаю это в сценариях оболочки Unix / Linux, не знаю, почему я никогда не думал делать это в пакетном режиме Windows.
Это кажется опасно упрощенным. Я никогда не хотел бы использовать его для чего-то, что я автоматизировал для пакетной обработки или отдавал кому-то другому . но это именно то, что доктор заказал для быстрого значка, который я могу разместить на своем рабочем столе для службы, которая мне нужна время от времени быстро переключайтесь.
Вы можете использовать следующую команду, чтобы узнать, запущена служба или нет:
Когда я запускаю его для своего антивируса NOD32, я получаю:
Если бы его остановили, я бы получил:
Вы можете использовать это в переменной, чтобы затем определить, используете ли вы NET START или нет.
Имя службы должно быть именем службы, а не отображаемым именем.
Спасибо за вашу помощь, пока я пытаюсь интегрировать то, что вы опубликовали, я значительно увеличил свои навыки работы с
Это должно сработать:
Независимая от языка версия.
Я сделал сценарий универсальным, поэтому он позволяет мне использовать его в задачах планировщика Windows. Просто замените Set ServiceName=Jenkins на Set ServiceName=%~1 и назовите это как watch-service.bat "Jenkins"
@ Ant_222 Он использует queryex вместо query, который зависит от языка. А почему вы думаете, что это не Windows batch? Вы пробовали его использовать?
Я только что нашел эту ветку и хотел добавить в обсуждение, если человек не хочет использовать командный файл для перезапуска служб. В Windows есть опция, если вы перейдете в Сервисы, свойства службы, затем восстановление. Здесь вы можете установить параметры услуги. Хотелось бы перезапустить службу, если служба остановится. Кроме того, у вас даже может быть вторая неудачная попытка сделать что-то другое, например, перезагрузить компьютер.
@ArtGertner - завершение (через диспетчер задач) процесса обслуживания будет интерпретировано как «сбой» и вызовет восстановление.
Cuando se использует Windows en Español, el código debe quedar asi (при использовании Windows на испанском языке код следующий):
Reemplazar MYSERVICE с номером обслуживания, который находится в процессе обработки. Puedes ver el nombre del servicio viendo las propiedades del servicio. (Замените MYSERVICE названием службы, которая будет обрабатываться. Вы можете увидеть имя службы в ее свойствах.)
Не уверен, почему голос против. Это важный момент и причина по возможности избегать сравнения строк. В этом случае вам необходимо изменить строку в зависимости от языка по умолчанию целевой установки Windows.
@lc: Было бы разумно включать ответ для каждого языка? Было бы более полезно сослаться на (или включить) ресурс, в котором указано, в какой строке искать данный язык.
Для Windows Server 2012 у меня сработало то, что ниже. Замените только "SERVICENAME" фактическим названием службы:
Запуск службы с использованием сценария Powershell. Вы можете связать это с планировщиком задач и запускать его через определенные промежутки времени или по мере необходимости. Создайте его как файл PS1, то есть файл с расширением PS1, а затем позвольте этому файлу запускаться из планировщика задач.
Для запуска остановки службы
в планировщике задач, если вы используете его на сервере, используйте это в аргументах
-noprofile -executionpolicy bypass -file "C: \ Service Restart Scripts \ StopService.PS1"
проверьте, запустив то же самое на cmd, если он работает, он также должен работать в планировщике задач
Как я могу написать скрипт bat или cmd, чтобы остановить и надежно запустить службу с проверкой ошибок (или сообщить мне, что по какой-то причине она не удалась)?
Может быть, это немного не по теме (поскольку вы просите инструкции bat & cmd), но: PowerShell дает вам большой контроль и обратную связь для выполнения таких действий.
Используйте команду SC (service control), она дает вам гораздо больше возможностей, чем просто start & stop .
Я согласен, что это лучше, чем чистый старт / стоп. Обратите внимание, что на удаленных машинах также есть возможность касаться сервисов.
Отличный ответ. Но вы должны быть администратором, чтобы запустить «SC start service». Я нашел решение для этого здесь . (Принятый ответ содержит решение)
Проблема с SC заключается в том, что команда возвращается сразу, а не после завершения действия. Если вы хотите перезапустить службу через командный файл (остановка, затем запуск), остановка возвращается немедленно, затем запуск завершается неудачно, потому что служба не остановлена. Чистый стоп / старт возвращается после завершения действия, поэтому не имеет этой проблемы.
скажу вам, были ли они успешными или провалились довольно четко. Например
При запуске из пакетного файла у вас есть доступ к ERRORLEVEL кода возврата. 0 указывает на успех. Все, что выше, означает неудачу.
В файле летучей мыши, error.bat :
Вывод выглядит так:
Коды возврата
Изменить 20.04.2015
Команда NET не возвращает документированные коды возврата класса Win32_Service (служба неактивна, время ожидания запроса на обслуживание и т. Д.), И для многих ошибок просто возвращает уровень ошибки 2.
NET не только для функций, связанных с сервисом, в то время SC как только для функций, связанных с сервисом.
Этот ответ лучше, потому что команда «net» блокирует и ждет, пока служба запустится или остановится, прежде чем пакетный скрипт продолжит выполняться.
Поскольку (как говорит Edit) большую часть времени errorlevel возвращает 2, смотрите здесь, как интерпретировать результат ошибки .
Вы можете использовать команду NET START, а затем проверить переменную среды ERRORLEVEL, например:
Отказ от ответственности: я написал это из головы, но я думаю, что это будет работать.
Вместо проверки кодов это тоже работает
Для этого я создал свой личный пакетный файл, мой немного отличается, но вы можете изменить его по своему усмотрению. Я создал это некоторое время назад, потому что мне было скучно, и я хотел, чтобы люди могли просто ввести окончание, запуск, остановку или установку на авто. Этот BAT-файл просто запрашивает ввод имени службы, и он сделает все остальное за вас. Я не осознавал, что он искал что-то, что говорило об ошибке, я, должно быть, неправильно понял эту часть. Хотя обычно это можно сделать, введя >> output.txt в конце строки.
% Var% - это просто способ, позволяющий пользователю вводить в него свой собственный сервис, вместо того, чтобы каждый раз изменять файл bat каждый раз, когда вы хотите запустить / остановить другой сервис.
Если я ошибаюсь, любой может смело поправлять меня в этом.
Как правило, ответы только кода не приветствуются. Не могли бы вы уточнить свое решение или добавить пояснительные комментарии?
Я создал это некоторое время назад, потому что мне было скучно, и я хотел, чтобы люди могли просто ввести окончание, запуск, остановку или установку на авто. Этот BAT-файл просто запрашивает ввод имени службы, и он сделает все остальное за вас.
Использование кодов возврата от net start и net stop кажется мне лучшим способом. Попробуйте взглянуть на это: коды возврата Net Start .
Синтаксис всегда получает меня . так что .
Здесь подробно показано, как добавить в пакетный файл строку, которая убьет удаленную службу (на другом компьютере), если вы являетесь администратором на обеих машинах, запустите .bat от имени администратора, и машины будут в одном домене. Имя машины соответствует формату UNC \ myserver
В этом случае . p4_1 было одновременно именем службы и отображаемым именем при просмотре свойств службы в Service Manager. Вы должны использовать Имя Сервиса.
Для наркоманов Service Ops . обязательно добавьте свой код причины и комментарий! то есть «4», что равно «Запланировано» и комментарий «Остановка сервера для обслуживания»
Как мне это сделать, если мне нужно использовать другой идентификатор пользователя и пароль для входа в систему?
Вы запускаете CMD от имени другого пользователя / идентификатора, runas /user:Domain\UserName cmd затем вводите пароль. CMD начнет работать как указанная учетная запись пользователя.
Мы хотели бы думать, что «чистый стоп» остановит сервис. К сожалению, реальность не такая уж черно-белая. Если для остановки службы требуется много времени, команда вернется до остановки службы. Вы не будете знать, хотя, если вы не проверите уровень ошибки.
Похоже, что решение состоит в том, чтобы циклически проверять состояние службы до ее остановки, с паузой каждый раз вокруг цикла.
Я вижу, что первая служба долго останавливается, а затем «чистая остановка» для следующей службы, похоже, ничего не делает. Посмотрите на сервис в диспетчере сервисов, и его состояние все еще "Запущено" - без изменений в "Остановка". Тем не менее, я могу остановить этот второй сервис вручную с помощью SCM, и он останавливается через 3 или 4 секунды.
Читайте также: