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

13

Eu vim com o arquivo em lotes abaixo e está funcionando muito bem. No entanto, gostaria de saber se existe uma maneira de codificá-lo para que, se um programa já estiver sendo executado, 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\"
user259671
fonte
1
psst. PowerShell é bom.
Kolob Canyon

Respostas:

20

Aqui está um exemplo usando a lista de tarefas para verificar todos os aplicativos em execução para um determinado nome.
Caso contrário, 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)
nixda
fonte
Certifique-se de tudo isto é em uma linha, este formatos do site lo para que ele quebra a ||- não quebrá-lo
CAD cara
3

Eu implementei a lista de tarefas no meu script e está funcionando como um encanto.
Aqui é para qualquer 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\"
user259671
fonte
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
fonte
1

Aqui está uma versão do PowerShell (em vez de CMD).

(Você pode executar o PowerShell a partir do CMD chamando " powershell.exe".

Este script faz o seguinte:

  1. Verifica a lista de processos para um processo específico e, se o processo não for encontrado na lista ...
  2. Ele procurará o executável em um local específico (como arquivos de programa) e o executará.

Neste exemplo, estou iniciando o Skype for Business (AKA "lync").

Aqui está um liner 1:

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

Aqui está uma versão 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")
}

(Na verdade, você não precisa procurar o executável; pode executá-lo diretamente - no entanto, a busca pelo executável permite atualizações do MS Office, que às vezes podem alterar o diretório de instalação)

Nullldata
fonte