Por que o cmd não sai após a execução do arquivo em lotes?


25

Por que o cmd não sai após a execução do arquivo em lotes?

Eu tentei:

"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

e

@echo off
"C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar
exit

Respostas:


31

Se o aplicativo Java não terminar (por exemplo, você estiver usando o arquivo em lotes para iniciar o aplicativo Java), use o startcomando para iniciá-lo: -

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

Isso iniciará o aplicativo java e continuará executando o arquivo em lotes sem aguardar a conclusão do aplicativo java.


20

Explicação:

Aqui está como isso funciona; um arquivo em lotes é processado uma linha por vez. Cada comando é executado por sua vez e o processador em lote aguarda a conclusão de um comando antes de iniciar o próximo. O problema que você está enfrentando é porque o aplicativo Java que você está iniciando (Jilko.jar) é um programa em janela que continua em execução mesmo após a linha que o inicia. Se fosse uma ferramenta que executa alguma ação e termina, o arquivo em lotes continuará no próximo comando (ou sairá se não houver mais). Como o programa ainda está em execução, o processador em lote espera até que a janela seja fechada antes de prosseguir. Você pode ver isso em ação saindo do programa Java: a janela do console com o arquivo em lotes é fechada.


Solução:

O que você precisa fazer para corrigi-lo é instruir o processador em lote a iniciar o programa e continuar sem esperar:

start "" "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar

Como Terrance mencionou , ""é o título a ser usado na janela do console. No entanto, é opcional apenas se o comando não estiver entre aspas; caso contrário, é necessário . Você pode colocar algo lá se quiser ou deixá-lo vazio, mas se o comando estiver entre aspas, ele deve estar presente; caso contrário, o interpretador de comandos tratará o comando citado como o título e abrirá um console que fica lá esperando por algo para fazer.

Você pode usar algo como o seguinte comando, mas as aspas são apenas mais fáceis e seguras, já que não é garantido que nomes curtos sejam iguais em todos os sistemas.

start C:\Progra~2\Java\jre6\bin\javaw.exe -Xmx1024M -Xms1024M -jar Jilko.jar

O startcomando é um comando interno que gera um processo (basicamente como executar um programa no menu Iniciar). Portanto, o que acontece nesse contexto é que o processador em lote executa o startcomando que, por sua vez, executa o programa especificado e finaliza (ele próprio, não o programa gerado). Como tal, o processador em lote continua conforme o esperado. Ele também possui algumas opções que podem ser úteis, como executar o programa minimized ( /min) ou maximized ( /max), executá-lo em baixa prioridade ( /low) e assim por diante. Veja start /?para detalhes.


Podemos considerar o começo como nohup en.wikipedia.org/wiki/Nohup
Muhammad Hewedy

Não. (A menos que você queira comparar com nohup e &).
Hennes 16/10

7

Descobri que alguns dos programas iniciados deixam os processos em execução e a janela do console não fecha até que sejam finalizados se eu apenas executá-los iniciando o executável.

O programa START corrige isso, mas o antigo problema com o START ainda existe. Você não pode simplesmente usar:

START "c:\my dir\myfile.exe"

O primeiro parâmetro de START ainda é o nome da janela. Se você omitir, basta abrir uma caixa de console CMD com a janela com o nome que você tentou iniciar. Na instância acima, agora eu teria uma janela do console com o título da janela " c: \ my dir \ myfile.exe ". Não é o que eu queria!

Para omitir o nome da janela, use um par de aspas duplas para definir uma sequência vazia, como:

START "" "c:\my dir\myfile.exe"

Por fim, encerre seu arquivo em lotes com um comando EXIT para garantir que ele seja fechado.

Este método parece funcionar consistentemente no Windows 7 e 8.

Para solução de problemas, acho que adicionar um ECHO do que estou prestes a fazer, e um TEMPO LIMITADO do que acabei de fazer, ajuda muito. Por exemplo:

ECHO I'm about to launch the program...
START "" "c:\my dir\myfile.exe"
TIMEOUT 5

Como o Timeout fornece uma contagem regressiva, você não precisa ECO que está prestes a atrasar.


5

Além disso - use EXIT o tempo todo, no Windows 7, pois apenas chegar ao final do arquivo em lotes não o encerra necessariamente - como nas versões anteriores do Windows. O Windows 7 pode ser mais sensível a isso do que as versões anteriores do NT (por exemplo, Windows 2000 Professional). Isso foi mencionado em algumas, mas não em todas as respostas anteriores.

Detalhes da experiência pessoal para apoiar a resposta:

Depois de transferir uma instalação do StarOffice5.2 do Windows 2000 para o Windows 7, eu estava recebendo erros de espaço na memória ao encerrar o pacote. Isso não foi visto no Windows 2000.

Anos atrás, eu havia gravado arquivos em lote para fazer backup e restaurar automaticamente o soffice.ini, para permitir um reparo quando ele for corrompido (com frequência suficiente para ser um problema - o conjunto falha ao carregar). O backup automático (acionado por um link para o arquivo em lotes, colocado em Office52 \ user \ config \ startup) ocorre apenas após um atraso de 5 segundos. Percebi que sempre que saía do conjunto pouco antes da execução do arquivo em lotes, o término do conjunto era sem erros. Isso me indicou um problema nos arquivos em lotes.

Depois que o comando 'EXIT' foi colocado como a última linha nos arquivos em lotes, o conjunto de escritórios começou a terminar sem mensagens de erro de espaço em memória, o tempo todo, independentemente de os Arquivos em Lote terem sido executados ou não.


2

Depois que o aplicativo estiver pronto, ele deverá estar saindo. Tem certeza de que o aplicativo Java está saindo corretamente?


2

Eu estava apenas lidando com o mesmo problema, e ele finalmente se resolveu depois de fazer o que parecia ser uma mudança aleatória no arquivo de lote - não entendo o porquê, mas vou publicá-lo aqui, caso ajude alguém mais tarde.

Faço uso do utilitário SysInternals Pskill e do utilitário sleep , pois o XP Home não inclui muito em termos de funcionalidade da linha de comando.


Este é o arquivo em lotes que realmente fecha após a conclusão:

@echo off
start /min C:\Progra~1\PsTools\pskill.exe explorer.exe
start /min C:\Progra~1\PsTools\pskill.exe Powermenu.exe
start /min C:\Progra~1\PsTools\pskill.exe PWGen.exe
start /min C:\Progra~1\PsTools\pskill.exe redshiftgui.exe
start /min C:\Progra~1\PsTools\pskill.exe clipx.exe
sleep 2
start explorer.exe
sleep 3
start C:\Progra~1\ClipX\clipx.exe
sleep 1
start C:\Progra~1\Powermenu\PowerMenu.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
start C:\Progra~1\RedshiftGUI\redshiftgui.exe && exit

Se eu tivesse as últimas linhas alteradas assim, a janela cmd permaneceria aberta até eu clicar no 'X' no canto:

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe && exit

Mesmo quando eu tentava invocar o pskill para se matar, o processo cmd.exe desaparecia do Gerenciador de Tarefas, e o pskill informava de dentro do cmd.exe que o processo cmd.exe havia sido morto, mas a cmd.exejanela ainda permaneceria até Cliquei no 'X' no canto:

start C:\Progra~1\RedshiftGUI\redshiftgui.exe
sleep 1
start /min C:\Progra~1\PWGen\PWGen.exe
sleep 1
C:\Progra~1\PsTools\pskill.exe cmd.exe

Depois que adicionei && exittodas as linhas, notei que algumas delas responderam e interromperiam o processamento em lote - enquanto outras não.

Então, eu apenas coloquei um dos responsivos no final, em vez de como eu o tinha originalmente.

Como eu disse, não sei por que, mas estou feliz que isso acabou.


1
Isso é tão desnecessário .
Surfasb

&& exit funciona para mim
jekcom

1

experimentar:

cmd /c "C:\Program Files (x86)\Java\jre6\bin\javaw.exe" -Xmx1024M -Xms1024M -jar Jilko.jar


0

Aqui está como eu fiz isso:

  1. Crie um arquivo em lotes com o seguinte conteúdo:

    java -Xms512M -Xmx512M -jar yourFileName.jar -o true
    EXIT
    
  2. No seu fluxo de entrada de saída, adicione:

    System.exit(1);
    

0

O Windows 2003 não possui "Contas de Usuário" no Painel de Controle por padrão. Escrevi um pequeno lote para abrir Contas de Usuário:

@echo off  
rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll  
exit

Funcionou bem, as contas de usuário foram abertas, mas a janela do CMD também permaneceu aberta. Depois de algumas pesquisas aqui, eu adicionei: START "" ao início da linha 2 da seguinte forma:

@echo off  
Start "" rundll32.exe %SystemRoot%\system32\netplwiz.dll,UsersRunDll o
exit

Agora a janela Contas de usuário é aberta, permanece aberta e a janela CMD é fechada. Mole-mole.


0

Estive pesquisando e procurando uma solução para fechar uma janela de arquivo em lotes quando o comando EXIT deixa a janela aberta por um motivo desconhecido. Eu finalmente me deparei com uma solução.

Remova EXIT do final do arquivo em lotes e use:

Taskkill /IM conhost.exe /F

0

Criei um arquivo em lotes de uso líquido em uma máquina Windows 32 de 32 bits e o cmd do arquivo em lotes não será encerrado após a execução. Eu executo o mesmo arquivo em lotes em outra máquina Windows 64 de 64 bits e o cmd do arquivo em lotes é encerrado normalmente.

Tentei a sugestão de Bryan e ele não funciona nessa máquina com Windows 7 de 32 bits porque não havia nenhum processo conhost.exe, então a modifiquei da seguinte maneira:

Taskkill /IM cmd.exe /F

O arquivo em lote de uso líquido nem sempre sai normalmente e mostra a confirmação "Terminar trabalho em lotes (S / N)" aleatoriamente .

De acordo com esse segmento , modifiquei o arquivo em lotes da seguinte maneira:

@echo off

if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)

net use \\Server\folder

Taskkill /IM cmd.exe /F

O arquivo em lote net use eventualmente sai normalmente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.