Как я могу проверить, запущено ли приложение из пакетного (хорошо cmd) файла?
Мне не нужно запускать другой экземпляр, если программа уже запущена. (Я не могу изменить приложение, чтобы сделать его только один экземпляр.)
Также приложение может работать как любой пользователь.
windows
command-line
batch-file
Мэтт Лэйси
источник
источник
Ответы:
Еще одна возможность, которую я придумал, вдохновленная использованием grep :
Не нужно сохранять дополнительный файл, поэтому я предпочитаю этот метод.
источник
tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL
/if %ERRORLEVEL%==1 goto wordnotrunning
для того, чтобы заставить его работать (подозревая цитату вокруг частей if/?
экран справки . Так, например,IMAGENAME
в польской версии естьNAZWA_OBRAZU
.tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL
Первый NUL кажется ненужным, я понятия не имею, для чего нужен «2», / NH не обязателен.Вот как я это сделал:
Приведенное выше откроет Блокнот, если он еще не запущен.
Изменить: Обратите внимание, что это не найдет приложения, скрытые от списка задач. Это будет включать любые запланированные задачи, выполняемые от имени другого пользователя, поскольку они автоматически скрываются.
источник
Мне нравится решение Chaosmaster! Но я искал решение, которое не запускает другую внешнюю программу (например, find.exe или findstr.exe ). Поэтому я добавил идею из решения Мэтта Лейси, которое создает временный файл, которого можно избежать. В конце я смог найти довольно простое решение, поэтому я поделился им ...
Это хорошо работает для меня ...
источник
Предложение npocmaka использовать QPROCESS вместо TASKLIST велико, но его ответ настолько велик и сложен, что я чувствую себя обязанным опубликовать довольно упрощенную версию, которая, я думаю, решит проблему большинства неопытных пользователей:
Приведенный выше код был протестирован в Windows 7 с пользователем с правами администратора.
источник
В 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)
источник
Only the administrator group members can use WMIC.EXE.
затемReason:Win32 Error: Access is denied.
источник
/i
.Я использую PV.exe с http://www.teamcti.com/pview/prcview.htm, установленный в Program Files \ PV с командным файлом, подобным этому:
источник
Ответ 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):источник
Я не знаю, как это сделать со встроенным CMD, но если у вас есть grep, вы можете попробовать следующее:
источник
Просто упомяните, что если ваше имя задачи действительно длинное, то оно не будет отображаться полностью в
tasklist
результате, поэтому может быть безопаснее (кроме локализации) проверить обратное.Вариация этого ответа :
источник
Я предполагаю, что окна здесь. Итак, вам нужно использовать WMI, чтобы получить эту информацию. Посмотрите в архиве сценаристов много примеров того, как использовать WMI из скрипта.
источник
Я использовал скрипт, предоставленный Мэттом (2008-10-02). Единственное, с чем я столкнулся, было то, что он не удалял
search.log
файл. Я ожидаю, потому что мне пришлось вcd
другое место, чтобы начать свою программу. Я быcd
вернулся туда, где находится файл BATsearch.log
, но он все равно не будет удален. Поэтому я решил это, удаливsearch.log
файл первым, а не последним.источник
Вам следует проверить имя родительского процесса, см . Статью « Проект кода» о решении на основе .NET ** .
Непрограммный способ проверки:
c:\windows\notepad.exe
)То же самое можно проверить, получив имя родительского процесса.
источник
Опираясь на ответ vtrz в и ответ Сэмюэля Renkert на в другой теме , я придумал следующий сценарий , который работает только ,
%EXEC_CMD%
если он еще не запущен:Как было сказано ранее, это требует административных привилегий.
источник
Node - (computer name) ERROR: Description = Invalid query
Мне нужно решение с повторной попыткой. Этот код будет работать до тех пор, пока процесс не будет найден, а затем уничтожит его. Вы можете установить тайм-аут или что-нибудь, если хотите.
Ноты:
taskkill.bat
:Бежать с
.\taskkill.bat ProgramToKill.exe
источник
Я обычно выполняю следующую команду в командной строке cmd, чтобы проверить, запущен ли мой program.exe:
источник