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

13

Se me ocurrió el archivo por lotes a continuación, y está funcionando muy bien. Sin embargo, me gustaría saber si hay una manera de codificarlo para que si un programa ya se está ejecutando, 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\"
usuario259671
fuente
1
psst. PowerShell es bueno.
Kolob Canyon

Respuestas:

20

Aquí hay un ejemplo usando la lista de tareas para verificar todas las aplicaciones en ejecución para un nombre dado.
De lo contrario, inicia el programa. Estoy seguro de que puedes adaptarlo a tus necesidades

tasklist /nh /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul ||
(start notepad.exe)
nixda
fuente
Asegúrese de que todo esté en una línea, este sitio lo formatea para que se rompa en ||- no lo rompa
CAD bloke
3

Implementé la lista de tareas en mi script y funciona 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\"
usuario259671
fuente
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
Santosh
fuente
1

Aquí hay una versión de PowerShell (en lugar de CMD).

(Puede ejecutar powershell desde CMD llamando a " powershell.exe".

Este script hace lo siguiente:

  1. Comprueba la lista de procesos para un proceso específico, y si el proceso no se encuentra en la lista ...
  2. Será buscar para el ejecutable en un lugar específico (como archivos de programa), y ejecutarlo.

En este ejemplo, estoy iniciando Skype Empresarial (también conocido como "lync").

Aquí hay un 1 liner:

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

Aquí hay una versión comentada:

# 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")
}

(No tiene que buscar realmente el ejecutable, sino que podría ejecutarlo directamente; sin embargo, la búsqueda del ejecutable permite actualizaciones de MS Office que a veces pueden cambiar el directorio de instalación)

Nullldata
fuente