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