Inicie programas via linha de comando, mas somente se ainda não estiver em execução

Inicie programas via linha de comando, mas somente se ainda não estiver em execução

Eu criei o arquivo em lote abaixo e está funcionando muito bem. Porém, gostaria de saber se existe uma maneira de codificá-lo para que, se um programa já estiver em execução, ele o ignore e inicie o próximo. Espero que isto faça sentido. Qualquer conselho seria muito apreciado.

@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\"

Responder1

Aqui está um exemplo usandolista de tarefaspara verificar todos os aplicativos em execução em busca de um determinado nome.
Caso contrário, ele inicia o programa. Tenho certeza que você pode adaptá-lo às suas necessidades

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

Responder2

Implementei a lista de tarefas em meu script e está funcionando perfeitamente.
Aqui está para qualquer outra pessoa que tenha as mesmas perguntas que eu.

@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\"

Responder3

@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

Responder4

Segui a resposta de nixda, que funcionou muito bem, mas tive um problema em que várias cópias do meu aplicativo ainda estavam iniciando!!

Isso ocorreu devido ao comprimento do meu nome .exe, então pensei em adicionar uma versão ajustada da resposta de nixda aqui, caso outros tenham o mesmo problema.

Se o seu nome .exe for longo, como: "SomeReallyVerySuperLongProgram.exe", a lista de tarefas truncará sua saída, o que significa que quando você canaliza a saída para o comando find, ele falha e abre uma segunda instância do seu aplicativo.

Por exemplo:

insira a descrição da imagem aqui

Então, em vez de usar a lista de tarefas, usei o comando wmic para descobrir se o processo já estava em execução.

Aqui está minha versão ajustada:

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

informação relacionada