Запускайте программы через командную строку, но только если они еще не запущены

Запускайте программы через командную строку, но только если они еще не запущены

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

@echo off    
pushd    
start "" cmd /c cscript "C:\Users\User\Desktop\Work.vbs"    
start "C:\Program Files\Microsoft Office\Office15" Outlook.exe    
start "C:\Program Files\Microsoft Office\Office15" Lync.exe    
start "C:\Program Files (x86)\Google\Chrome\Application" chrome.exe    
runas /savecred /user:"DOMAIN\User_Adm" "C:\Program Files (x86)\VMware\Infrastructure\Virtual Infrastructure Client\Launcher\VpxClient.exe"    
runas /savecred /user:"DOMAIN\User_Adm" "mmc.exe \"My_Tools.msc\"

решение1

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

tasklist /nh /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul || (start notepad.exe)

решение2

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

@echo off
pushd
tasklist /nh /fi "imagename eq iexplore.exe" | find /i "iexplore.exe" > nul ||(start Work.vbs)
tasklist /nh /fi "imagename eq outlook.exe" | find /i "outlook.exe" > nul ||(start outlook.exe)
tasklist /nh /fi "imagename eq lync.exe" | find /i "lync.exe" > nul ||(start lync.exe)
tasklist /nh /fi "imagename eq chrome.exe" | find /i "chrome.exe" > nul ||(start chrome.exe)
tasklist /nh /fi "imagename eq VpxClient.exe" | find /i "VpxClient.exe" > nul || runas /savecred /user:"DOMAIN\User_Adm" "C:\Program Files (x86)\VMware\Infrastructure\Virtual Infrastructure Client\Launcher\VpxClient.exe"
tasklist /nh /fi "imagename eq mmc.exe" | find /i "mmc.exe" > nul || runas /savecred /user:"DOMAIN\User_Adm" "mmc.exe \"My_Tools.msc\"

решение3

@echo off      
tasklist /FI "IMAGENAME eq outlook.exe" | find /i "outlook.exe"      

IF ERRORLEVEL 2 GOTO LOOP2
IF ERRORLEVEL 1 GOTO LOOP1 

:LOOP1 
  start notepad.exe
goto EXIT     

:LOOP1 
  start outlook.exe 
goto EXIT 

:EXIT

решение4

Я последовал ответу nixda, который отлично сработал, однако у меня возникла проблема, из-за которой все еще запускались несколько копий моего приложения!!

Это произошло из-за длины имени моего .exe-файла, поэтому я решил добавить сюда измененную версию ответа nixda на случай, если у других возникнет такая же проблема.

Если имя вашего .exe длинное, например: «SomeReallyVerySuperLongProgram.exe», то tasklist обрезает его вывод, что означает, что при передаче вывода команде find она завершается ошибкой и открывается второй экземпляр вашего приложения.

Например:

введите описание изображения здесь

Поэтому вместо использования tasklist я использовал команду wmic, чтобы узнать, какой процесс уже запущен.

Вот моя измененная версия:

wmic process where "name='win32calc.exe'" get ProcessID | find /i "ProcessId" > nul || (start /min win32calc.exe)

Связанный контент