2010-09-25 04:19:24 +0000 2010-09-25 04:19:24 +0000
25
25

Porque é que a cmd não sai após a execução do ficheiro de lote?

Porque é que a cmd não sai após a execução do ficheiro de 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

Respostas (11)

31
31
31
2010-09-25 07:28:36 +0000

Se a aplicação Java não terminar (por exemplo, está a utilizar o ficheiro batch para lançar a aplicação Java), então utilize o comando start para o lançar:-

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

Isto irá lançar a aplicação java e continuar a executar o ficheiro batch sem esperar que a aplicação java termine.

20
20
20
2012-01-26 01:17:52 +0000

Explicação:

Aqui está como funciona; um ficheiro de lote é processado uma linha de cada vez. Cada comando é executado por sua vez e o processador de lote espera que um comando termine antes de iniciar o próximo. O problema que está a experimentar é porque a aplicação Java que está a lançar (Jilko.jar) é um programa em janela que continua a correr mesmo depois da linha que o lança. Se fosse uma ferramenta que executa alguma acção e depois termina, o ficheiro de lote continuaria para o comando seguinte (ou sairia se já não houvesse mais). Como o programa ainda está em execução, o processador de lotes espera até que a janela seja fechada antes de avançar. Pode ver isto em acção ao sair do programa Java: a janela da consola com o ficheiro de lote fecha-se depois.

Solução:

O que precisa de fazer para o corrigir, é instruir o processador de lotes a lançar o programa e a continuar sem esperar como tal:

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

Como Terrance mencionou , o "" é o título a utilizar para a janela da consola. No entanto, só é opcional se o comando não estiver entre aspas; caso contrário é requerido. Pode colocar algo lá dentro se quiser ou deixá-lo vazio, mas se o comando estiver entre aspas, deve estar presente, caso contrário o intérprete do comando tratará o comando citado como o título e abrirá uma consola que apenas se senta lá à espera de algo para fazer.

Em vez disso, pode utilizar o seguinte comando, mas as citações são apenas mais fáceis e seguras, uma vez 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 incorporado que gera um processo (basicamente como executar um programa a partir do menu Iniciar). Assim, o que acontece neste contexto é que o processador de lotes executa o comando start que por sua vez executa o programa especificado e termina (ele próprio, não o programa desovado). Como tal, o processador de lotes continua a funcionar como esperado. Tem também algumas opções que podem ser úteis, como correr o programa minimizado (/min) ou maximizado (/max), correndo-o em baixa prioridade (/low) e assim por diante. Ver start /? para detalhes.

7
7
7
2013-05-15 23:43:30 +0000

Descobri que alguns dos programas que lanço deixam processos em execução, e a janela da consola não se fechará até que terminem se eu apenas os executar lançando o executável.

O programa START corrige isso, mas o velho problema com START ainda está por resolver. Não se pode simplesmente usar:

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

O primeiro parâmetro de START continua a ser o nome da janela. Se o omitir, basta abrir uma caixa de consola CMD com a janela com o nome do que quer que tenha tentado lançar. No exemplo acima, teria agora uma janela de consola com o título da janela de “c:{c:}meu dir\myfile.exe”. Não era o que eu queria!

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

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

Finalmente, termine o seu ficheiro de lote com um comando EXIT para garantir o seu encerramento.

Este método parece funcionar de forma consistente no Windows 7 e 8.

Para a resolução de problemas, acho que adicionar um ECHO do que estou prestes a fazer, depois 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

Uma vez que o Timeout lhe dá uma contagem decrescente, não precisa de um ECHO que está prestes a atrasar.

5
5
5
2012-01-26 00:59:18 +0000

Também – use EXIT at all times, sob Windows 7, pois só chegar ao fim do ficheiro de lote não o termina necessariamente – como em versões anteriores do Windows. O Windows 7 pode ser mais sensível a isto do que as versões anteriores do NT (por exemplo, Windows 2000 Professional). Isto foi mencionado em algumas, mas não em todas das 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, estava a receber erros de espaço de memória ao terminar a suite. Isto não foi visto no Windows 2000.

Há anos atrás, eu tinha escrito ficheiros de lote para fazer automaticamente cópias de segurança e restaurar o soffice.ini, para permitir uma reparação quando este se corrompe (frequentemente o suficiente para ser um problema - a suite não consegue carregar). O backup automático (desencadeado por uma ligação ao ficheiro de lote, colocado no Office52\config}startup) só ocorre, no entanto, cerca de 5 segundos depois de um atraso de 5 segundos. Notei que sempre que saí da suite imediatamente antes de o ficheiro de lote ter sido executado, a conclusão da suite foi sem erro. Isto apontou-me um problema nos ficheiros de lote.

Após o comando ‘EXIT’ ter sido colocado como última linha nos ficheiros de lote, a suite de escritório começou a terminar sem mensagens de erro de espaço de memória, a todo o momento, quer os Ficheiros de Lote tivessem ou não sido executados.

2
2
2
2010-11-06 03:27:04 +0000

Estava apenas a lidar com o mesmo problema, e ele finalmente resolveu-se a si próprio depois de fazer o que parecia ser alterações aleatórias ao ficheiro de lote - não percebo porquê, mas vou publicá-lo aqui no caso de ajudar mais tarde alguém.

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


Este é o ficheiro de lote 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 desta forma, a janela cmd ficaria 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 tentasse invocar pskill para se matar, o processo cmd.exe desapareceria do Gestor de Tarefas, e pskill relataria de dentro do seu cmd. exe que o processo cmd.exe tinha sido morto, no entanto a janela cmd.exe 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
sleep 1
C:\Progra~1\PsTools\pskill.exe cmd.exe

Depois de ter adicionado && exit a cada linha, reparei que alguns deles responderam e interromperiam o processo por lotes - enquanto outros não.

Por isso, acabei de colocar um dos que responderam no final, em vez de como o tinha originalmente.

Como eu disse, não sei porquê, mas estou contente por isto ter terminado.

2
2
2
2010-09-25 04:29:25 +0000

Uma vez terminada a aplicação, esta deve estar a sair. Tem a certeza de que a aplicação Java está a sair correctamente?

1
1
1
2010-09-25 04:51:34 +0000

tentar:

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

0
0
0
2015-10-16 12:53:17 +0000

O Windows 2003 não tem “Contas de Utilizador” no Painel de Controlo por defeito. Escrevi um pequeno lote para abrir Contas de Utilizador:

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

Funcionou bem, as Contas de Utilizador abriram, mas a janela CMD também permaneceu aberta. Depois de alguma pesquisa aqui, acrescentei: INICIAR “” ao início da linha 2, assim:

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

Agora a janela de Contas de Utilizador abre-se, permanece aberta e a janela CMD fecha-se. Easy Peasy.

0
0
0
2016-01-01 06:06:20 +0000

Tenho procurado e procurado uma solução para fechar uma janela de ficheiro de lote quando o comando EXIT deixa a janela aberta por uma razão desconhecida. Finalmente deparei-me com uma solução.

Remover EXIT do fim do ficheiro de lote e utilizar:

Taskkill /IM conhost.exe /F
0
0
0
2016-07-15 10:37:30 +0000

Criei um ficheiro de lote de utilização de rede numa máquina Windows 7 de 32 bits e o cmd do ficheiro de lote não sairá após a execução. Executo o mesmo ficheiro de lote noutra máquina Windows 7 de 64 bits e o cmd do ficheiro de saída do lote sai normalmente.

Eu tentei sugestão de Bryan e não funciona nessa máquina de 32-bit do Windows 7 porque não havia processo conhost.exe por isso modifiquei-o como se segue:

Taskkill /IM cmd.exe /F

O ficheiro net use batch nem sempre sai normalmente e mostra a confirmação “Terminar trabalho batch (S/N)” randomly*.

De acordo com este thread Modifiquei o ficheiro de lote como se segue:

@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 ficheiro de lote de utilização líquida eventualmente* saem normalmente.

0
0
0
2014-06-21 17:43:16 +0000

Aqui está como o fiz:

  1. criar um ficheiro de lote com o seguinte conteúdo:

  2. Dentro do seu fluxo de entrada de saída, adicione: