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

13

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

@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\"
user259671
источник
1
Psst. PowerShell это хорошо.
Каньон Колоб

Ответы:

20

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

tasklist /nh /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul ||
(start notepad.exe)
nixda
источник
Убедитесь, что это все в одной строке, этот сайт форматирует его так, чтобы он ||
CAD bloke
3

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

@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\"
user259671
источник
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
Сантош
источник
1

Вот версия PowerShell (вместо CMD).

(Вы можете запустить powershell из CMD, вызвав " powershell.exe".

Этот скрипт выполняет следующие действия:

  1. Проверяет список процессов для определенного процесса, и если процесс не найден в списке ...
  2. Он будет искать исполняемый файл в определенном месте (например, программные файлы) и запускать его.

В этом примере я запускаю Skype для бизнеса (AKA "lync").

Вот 1 вкладыш:

if (!((Get-Process | select ProcessName).ProcessName | where {$_ -like "*lync*"})){&(where.exe /R "C:\Program Files (x86)\Microsoft Office" "lync.exe")}

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

# If there isn't a running process that contains "lync"...
if (!((Get-Process | select ProcessName).ProcessName | where {$_ -like "*lync*"}))
{
    # Find the executable somewhere in program files (x86), and run it.
    &(where.exe /R "C:\Program Files (x86)\Microsoft Office" "lync.exe")
}

(На самом деле вам не нужно искать исполняемый файл, вместо этого вы можете запустить его напрямую - однако поиск исполняемого файла позволяет выполнять обновления MS Office, которые иногда могут изменить каталог установки)

Nullldata
источник