Запустите программу из пакета, не допуская дубликатов - PullRequest
0 голосов
/ 21 января 2020

Я запускаю программу из Batch, но если она уже запущена, я хочу не запускать второй экземпляр.

До сих пор я создал следующий код, который работает:

TASKLIST /FI "IMAGENAME eq speedfan.exe" | FIND "speedfan.exe" >NUL
IF %ERRORLEVEL%==0 (
    TASKKILL /F /IM speedfan.exe
)
START "" "C:\Program Files (x86)\SpeedFan\speedfan.exe"

В качестве альтернативы, если я хочу сохранить текущий экземпляр вместо запуска нового:

TASKLIST /FI "IMAGENAME eq speedfan.exe" | FIND "speedfan.exe" >NUL
IF NOT %ERRORLEVEL%==0 (
    START "" "C:\Program Files (x86)\SpeedFan\speedfan.exe"
)

Можно ли это улучшить / упростить?


Обновление: Спасибо всем за ваши комментарии! Пока что мой пересмотренный код становится:

TASKLIST /FI "IMAGENAME eq speedfan.exe" | FINDSTR /BLI "speedfan.exe " >NUL || (
    START "" "C:\Program Files (x86)\SpeedFan\speedfan.exe"
)

(и, возможно, я упущу часть /FI "IMAGENAME eq speedfan.exe" ради простоты)

1 Ответ

1 голос
/ 21 января 2020

Вот быстрый пример, предназначенный для запроса подтверждения ввода, чтобы закрыть его, если он запущен, или просто открыть его, если он не запущен. Я надеюсь, что это достаточно надежно для ваших целей.

@"%__AppDir__%tasklist.exe" /Fi "ImageName Eq speedfan.exe" /Fo CSV /NH^
 | "%__AppDir__%find.exe" ":" > NUL && (
    Start "" "C:\Program Files (x86)\SpeedFan\speedfan.exe") || (
    "%__AppDir__%choice.exe" /M "Would you like to close SpeedFan"
    If Not ErrorLevel 2 "%__AppDir__%taskkill.exe" /Im speedfan.exe /T > NUL)

Я разбил длинную первую строку на две для аккуратности и потому, что вам не особо нравятся длинные строки.

...