
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:
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)