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

23

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

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
    
por Joe 25.09.2010 / 06:19

11 respostas

29

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

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

Isso iniciará o aplicativo java e executará o arquivo em lote sem aguardar o término do aplicativo java.

    
por 25.09.2010 / 09:28
19

Explicação:

Aqui está como funciona; um arquivo em lote é processado em uma linha por vez. Cada comando é executado por sua vez e o processador em lote espera que um comando termine antes de iniciar o próximo. O problema que você está enfrentando é que o aplicativo Java que você está iniciando (Jilko.jar) é um programa em janelas que continua a ser executado mesmo após a linha que o inicia. Se fosse uma ferramenta que executasse alguma ação e terminasse, o arquivo em lote continuaria no próximo comando (ou sairia se não houvesse mais). Como o programa ainda está em execução, o processador em lote aguarda 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 lote é fechada.


Solução:

O que você precisa fazer para corrigir isso é instruir o processador de 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 "" é o título a ser usado para a janela do console. No entanto, é apenas opcional se o comando não estiver entre aspas; caso contrário, é obrigató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 entre aspas como o título e abrirá um console que fica lá esperando por você. algo para fazer.

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

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

O comando start é 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 comando start , que por sua vez executa o programa especificado e termina (em si, não no programa gerado). Como tal, o processador de lote continua como esperado. Ele também tem algumas opções que podem ser úteis, como executar o programa minimizado ( /min ) ou maximizado ( /max ), executá-lo em baixa prioridade ( /low ) e assim por diante. Veja start /? para detalhes.

    
por 26.01.2012 / 02:17
6

Descobri que alguns dos programas que eu inicio deixam os processos em execução, e a janela do console não fecha até que eles terminem se eu os executar apenas iniciando o executável.

O programa START corrige isso, mas o antigo problema com o START ainda está por aí. 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ê omiti-lo, basta abrir uma caixa do console do CMD com a janela que você tentou iniciar. Na instância acima, eu agora teria uma janela de console com o título da janela " c: \ my dir \ myfile.exe ". Não é o que eu queria!

Para omitir o nome da janela, basta usar um par de aspas duplas para definir uma string vazia, como:

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

Por fim, finalize seu arquivo em lote 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 ECO do que estou prestes a fazer, então um TIMEOUT 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 tempo limite da contagem regressiva fornece uma contagem regressiva, não é necessário que você ECHO esteja atrasado.

    
por 16.05.2013 / 01:43
5

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

Detalhes da experiência pessoal para apoiar a resposta:

Após transferir uma instalação do StarOffice 5.0 do Windows 2000 para o Windows 7, eu estava recebendo erros de espaço de memória ao finalizar o conjunto. Isso não foi visto no Windows 2000.

Anos atrás, eu tinha escrito arquivos em lote para fazer o backup e restaurar automaticamente o soffice.ini, para permitir um reparo quando ele fosse corrompido (geralmente o suficiente para ser um problema - a suíte não carrega). O backup automático (acionado por um link para o arquivo em lotes, colocado no Office52 \ user \ config \ startup) ocorre apenas após um atraso de 5 segundos. Eu notei sempre que saía da suíte pouco antes de o arquivo de lote ser executado, a terminação da suíte acontecia sem erros. Isso me indicou um problema nos arquivos em lote.

Depois que o comando 'EXIT' foi colocado como a última linha nos arquivos em lote, o pacote do Office começou a terminar sem mensagens de erro de espaço de memória, em todos os momentos, se os arquivos em lote tinham sido executados ou não.

    
por 26.01.2012 / 01:59
2

Quando o aplicativo estiver pronto, ele deve sair. Tem certeza de que o aplicativo Java está saindo corretamente?

    
por 25.09.2010 / 06:29
2

Eu estava lidando com o mesmo problema, e ele finalmente se resolveu depois de fazer o que parecia ser uma mudança aleatória no batchfile - eu não entendo o porquê, mas vou postar aqui caso isso ajude alguém mais tarde. / p>

Eu faço uso do utilitário SysInternals Pskill e do sleep desde o XP Home não inclui muito em termos de funcionalidade de linha de comando.

Este é o arquivo batch que realmente fecha depois de feito:

@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 do cmd permaneceria aberta até que eu clicasse no 'X' no canto:

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

Mesmo quando tentei invocar o pskill para se matar, o processo cmd.exe desapareceria do Gerenciador de Tarefas, e o pskill informaria de dentro do cmd.exe que o processo cmd.exe tinha sido eliminado, mas o cmd.exe janela ainda ficaria até eu 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 de adicionar && exit a cada linha, notei que alguns deles responderam a ela e interromperiam o processamento em lote, enquanto outros não o fariam.

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

Como eu disse, não sei por quê, mas estou feliz que isso tenha acabado.

    
por 06.11.2010 / 04:27
1

tente:

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

    
por 25.09.2010 / 06:51
0

Veja como eu fiz:

  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);
    
por 21.06.2014 / 19:43
0

O Windows 2003 não possui "Contas de usuário" no Painel de controle por padrão. Eu 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 permaneceu aberta também. Depois de algumas pesquisas aqui, eu adicionei: START "" para o começo da linha 2 assim:

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

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

    
por 16.10.2015 / 14:53
0

Eu tenho procurado e procurado uma solução para fechar uma janela de arquivo de lote quando o comando EXIT deixa a janela aberta por um motivo desconhecido. Eu finalmente encontrei uma solução.

Remova EXIT do final do arquivo de lote e use:

Taskkill /IM conhost.exe /F
    
por 01.01.2016 / 07:06
0

Eu criei um arquivo em lote de uso da rede em uma máquina Windows de 32 bits e o cmd do arquivo em lote não sai após a execução. Eu executo o mesmo arquivo de lote em outro computador com Windows 7 de 64 bits e o cmd do arquivo de lote sai normalmente.

Eu tentei a sugestão de Bryan e ele não funciona na máquina Windows 7 de 32 bits porque não havia mais nenhum especialista .exe processo, então eu modifiquei da seguinte forma:

Taskkill /IM cmd.exe /F

O arquivo em lote de uso da rede nem sempre sai normalmente e mostra a confirmação "Encerrar trabalho em lote (S / N)" aleatoriamente .

De acordo com este thread modifiquei o arquivo em lote da seguinte forma:

@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 de uso da rede eventualmente sai normalmente.

    
por 15.07.2016 / 12:37