Como posso verificar se um aplicativo está sendo executado a partir de um arquivo em lote (cmd)?
Preciso não iniciar outra instância se um programa já estiver sendo executado. Não consigo alterar o aplicativo para torná-lo apenas uma instância.
Além disso, o aplicativo pode estar sendo executado como qualquer usuário.
windows
command-line
batch-file
Matt Lacey
fonte
fonte
Respostas:
Outra possibilidade que surgiu, inspirada no uso do grep , é:
Como não é necessário salvar um arquivo extra, prefiro esse método.
fonte
tasklist /FI "IMAGENAME eq winword.exe" 2>NUL | find /I /N "winword.exe">NUL
/if %ERRORLEVEL%==1 goto wordnotrunning
de modo a torná-lo funciona (suspeitar da citação em torno das Se as peças/?
tela de ajuda . Então, por exemplo,IMAGENAME
na versão polonesa éNAZWA_OBRAZU
.tasklist /FI "IMAGENAME eq myapp.exe" /NH | find /I /N "myapp.exe" >NUL
O primeiro NUL parece desnecessário, não tenho idéia para que serve o '2', o / NH é opcional.Aqui está como eu resolvi isso:
O exemplo acima abrirá o Bloco de Notas se ainda não estiver em execução.
Editar: observe que isso não encontrará aplicativos ocultos da lista de tarefas. Isso incluirá todas as tarefas agendadas em execução como um usuário diferente, pois elas serão ocultadas automaticamente.
fonte
Eu gosto da solução do Chaosmaster! Mas eu olhei para uma solução que não iniciar outro programa externo (como Find.exe ou findstr.exe ). Então, adicionei a idéia da solução de Matt Lacey, que cria um arquivo temporário também evitável. No final, pude encontrar uma solução bastante simples, então eu a compartilho ...
Isso está funcionando muito bem para mim ...
fonte
A sugestão do npocmaka de usar o QPROCESS em vez do TASKLIST é ótima, mas sua resposta é tão grande e complexa que me sinto obrigado a postar uma versão bastante simplificada do mesmo, que eu acho que resolverá o problema da maioria dos usuários não avançados:
O código acima foi testado no Windows 7, com um usuário com direitos de administrador.
fonte
No Windows, você pode usar a WMI (Instrumentação de Gerenciamento do Windows) para garantir que nenhum aplicativo com a linha de comando especificada seja iniciado, por exemplo:
wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)
fonte
Only the administrator group members can use WMIC.EXE.
seguido porReason:Win32 Error: Access is denied.
fonte
/i
.Eu uso o PV.exe em http://www.teamcti.com/pview/prcview.htm instalado em Program Files \ PV com um arquivo em lotes como este:
fonte
A resposta de TrueY parecia a solução mais elegante; no entanto, eu tinha que fazer algumas brincadeiras, porque não entendia exatamente o que estava acontecendo. Deixe-me esclarecer as coisas, espero economizar algum tempo para a próxima pessoa.
Resposta modificada de TrueY:
Enfim, espero que ajude. Eu sei que às vezes ler lote / linha de comando pode ser meio confuso, às vezes, se você é um novato, como eu.
fonte
A resposta fornecida por Matt Lacey funciona no Windows XP. No entanto, no Windows Server 2003, a linha
retorna
que é então lido enquanto o processo está em execução.
Como não tenho muita experiência com scripts em lote, minha ação é procurar o nome do processo no
search.log
arquivo e bombear os resultados para outro arquivo e procurar por qualquer saída.Espero que isto ajude alguém.
fonte
I como o
WMIC
eTASKLIST
ferramentas, mas eles não estão disponíveis na home / edições básicas de windows.Another maneira é usarQPROCESS
comandos disponíveis em quase todos os máquina Windows (para os que têm serviços de terminal - Eu acho que só tem a ganhar XP sem SP2, assim practialy cada máquina de janelas):QPROCESS
O comando não é tão poderoso quantoTASKLIST
é limitado e mostra apenas 12 símbolos do nome do processo, mas deve ser levado em consideração seTASKLIST
não estiver disponível.Uso mais simples em que ele usa o nome se o processo como argumento (o
.exe
sufixo é obrigatório neste caso em que você passa o nome do executável):A diferença entre duas formas de
QPROCESS
uso é queQPROCESS *
listará todos os processos eQPROCESS some.exe
filtrará apenas os processos para o usuário atual.Usar
WMI
objetos através do Windows Script Host Exe em vez deWMIC
também é uma opção. Ele deve ser executado também em todas as máquinas Windows (excluindo aquelas em que o WSH está desativado, mas este é um caso raro) .Aqui está o arquivo bat que lista todos os processos através do WMI classes e pode ser usado no lugar doQPROCESS
script acima (é um híbrido jscript / bat e deve ser salvo como.bat
):E uma modificação que verificará se um processo está em execução:
As duas opções podem ser usadas em máquinas que não possuem
TASKLIST
.A técnica final está usando
MSHTA
. Isso será executado em todas as máquinas Windows a partir do XP e acima e não depende das configurações do host de scripts do Windows. a chamada deMSHTA
poderia reduzir um pouco o desempenho (novamente deve ser salvo como bastão):fonte
Não sei como fazer isso com o CMD embutido, mas se você tiver grep, tente o seguinte:
fonte
Apenas mencionando, se o nome da sua tarefa for realmente longo, ele não aparecerá na íntegra no
tasklist
resultado; portanto, pode ser mais seguro (além da localização) verificar o oposto.Variação desta resposta :
fonte
Estou assumindo janelas aqui. Portanto, você precisará usar o WMI para obter essas informações. Confira os arquivos da Equipe de Scripts para ver muitos exemplos de como usar o WMI a partir de um script.
fonte
Eu usei o script fornecido por Matt (02-10-2008). A única coisa com a qual tive problemas foi que ele não excluiria o
search.log
arquivo. Espero porque precisei ircd
para outro local para iniciar meu programa. Eucd
voltei para onde o arquivo BATsearch.log
está e , mas ele ainda não foi excluído. Então, resolvi isso excluindo osearch.log
arquivo primeiro e não o último.fonte
Você deve verificar o nome do processo pai, consulte o artigo The Code Project sobre uma solução baseada em .NET ** .
Uma maneira não programática de verificar:
c:\windows\notepad.exe
)O mesmo pode ser verificado obtendo o nome do processo pai.
fonte
Com base na resposta de vtrz e resposta de Samuel Renkert em um outro tópico , eu vim com o seguinte script que é executado somente
%EXEC_CMD%
se ele não estiver em execução:Como foi dito antes, isso requer privilégios administrativos.
fonte
Node - (computer name) ERROR: Description = Invalid query
Eu precisava de uma solução com uma nova tentativa. Esse código será executado até que o processo seja encontrado e depois o mate. Você pode definir um tempo limite ou qualquer coisa, se quiser.
Notas:
taskkill.bat
:Correr com
.\taskkill.bat ProgramToKill.exe
fonte
Normalmente, executo o seguinte comando no prompt do cmd para verificar se o meu program.exe está executando ou não:
fonte