Inicie programas a través de la línea de comandos, pero solo si aún no se están ejecutando

Inicie programas a través de la línea de comandos, pero solo si aún no se están ejecutando

Se me ocurrió el archivo por lotes a continuación y está funcionando muy bien. Sin embargo, me gustaría saber si hay alguna manera de codificarlo de modo que, si ya se está ejecutando un programa, lo omita y ejecute el siguiente. Espero que esto tenga sentido. Cualquier consejo sería muy 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\"

Respuesta1

Aquí hay un ejemplo usandolista de tareaspara verificar todas las aplicaciones en ejecución para un nombre determinado.
De lo contrario inicia el programa. Seguro que puedes adaptarlo a tus necesidades.

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

Respuesta2

Implementé la lista de tareas en mi script y está funcionando de maravilla.
Aquí está para cualquiera que tenga las mismas preguntas que yo.

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

Respuesta3

@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

Respuesta4

Seguí la respuesta de nixda, que funcionó muy bien, sin embargo, ¡tenía un problema en el que aún se estaban iniciando varias copias de mi aplicación!

Esto se debió a la longitud de mi nombre .exe, así que pensé en agregar una versión modificada de la respuesta de nixda aquí en caso de que otros tengan el mismo problema.

Si su nombre .exe es largo, como por ejemplo: "SomeReallyVerySuperLongProgram.exe", entonces la lista de tareas trunca su salida, lo que significa que cuando canaliza la salida al comando de búsqueda, falla y abre una segunda instancia de su aplicación.

Por ejemplo:

ingrese la descripción de la imagen aquí

Entonces, en lugar de usar la lista de tareas, usé el comando wmic para averiguar si el proceso ya se estaba ejecutando.

Aquí está mi versión modificada:

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

información relacionada