Questão Batch IF .exe não está sendo executado


Eu estou tentando criar um lote que IF program.exe não está sendo executado no processo, ele irá executar o código abaixo. Em vb.net isso é fácil, mas eu não quero criar um programa. Eu estou supondo que um script VBS funcionaria, mas estou tentando ver se posso criar uma rotina em lote para fazer o acima.

.bastão:

@ECHO OFF

REM peudo code:

If NOT program.exe Exist

'Do something.

O acima não funciona, então o que estou faltando?


1


origem


Você pode canalizar a lista de tarefas para findstr e executar o código de erro, desculpe no telefone, portanto, não é possível postar o exemplo - 50-3
tasklist | findstr program.exe você retornará uma linha se encontrada, e nenhuma linha se não for. - Frank Thomas
Seu pseudocódigo de exemplo está verificando se o programa FILE.exe existe no disco, não se tiver um processo na memória. PS: seria `If NOT EXIST program.exe '. - Ƭᴇcʜιᴇ007


Respostas:


Aqui vai você:

@echo off
tasklist /FI "IMAGENAME eq program.exe" 2>NUL | find /I /N "program.exe" >NUL
if "%ERRORLEVEL%"=="0" echo Program is running.

Ele usa Tasklist.exe para obter uma lista de tarefas que correspondem ao nome do programa e, em seguida, usa find para descobrir se o programa realmente existe na lista.

Em seguida, ele usa o código de erro retornado por find para determinar se ele foi encontrado e, em caso afirmativo, executa o código (o eco nesse caso).

Saída da lista de tarefas e localizar são enviadas para NULL.

Fonte


4





Aqui está a minha sugestão:

@echo off
tasklist /FI "IMAGENAME eq program.exe" | findstr "program.exe" >nul
if %ERRORLEVEL% == 1 goto mycode
goto eof
:mycode

rem put your code here

:eof
exit

Como @ techie007 sugeriu que eu recomendaria tasklist /FI "IMAGENAME eq program.exe" como ele só gera correspondências exatas para quando você está pesquisando cmd.exe você não está batendo htcmd.exe Não tenho certeza porque ele NULLs embora como está sendo canalizado.

Eu não tenho certeza porque ele está sugerindo find /I /N Eu pessoalmente prefiro findstr como é muito mais versátil, mas em sua sugestão faz o trabalho.

A última parte é onde minha sugestão seria diferente da de @ techie007 if %ERRORLEVEL% == 1 goto mycode  goto eof isso funcionará como uma instrução if else, se o programa não estiver em execução, vá para mycode (Onde você vai preencher com o bem ... seu código) mais vá para eof que sairá do lote.

Minha única falha com o techie007 é if "%ERRORLEVEL%"=="0" echo Program is running. como se isso é verdade ou falso, ele executará a próxima linha de código. É por isso que eu queria recomendar usar um goto metodologia, uma vez que irá suportar várias linhas de código.


1



A linha única é "if"% ERRORLEVEL% "==" 0 "echo O programa está sendo executado." Ele só executará o comando Echo se o resultado for True (errorlevel is 0). Não há "próxima linha de código". Apesar de funcionar independentemente de existir, é apenas porque está fora do bloco IF. :) - Ƭᴇcʜιᴇ007
Além disso, no Windows Vista (7?) E acima, o :eof label é embutido no Goto agora: "O comando GOTO agora aceita um rótulo de destino de: EOF que transfere o controle para o final do arquivo de script de lote atual. Essa é uma maneira fácil de sair de um arquivo de script de lote sem definir um rótulo." (goto /?) :) - Ƭᴇcʜιᴇ007
GOTO:eof é o que eu acho que você quer dizer e sim ele funciona na maioria dos sistemas Eu só prefiro usar o método estendido por causa do ensino - 50-3


echo off
SETLOCAL EnableExtensions
set EXE=YourProgram.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
echo Not running
pause
goto FIN
:FOUND
echo Running
pause
:FIN

Isso funcionou para mim.


0