Chamar .exe de um .bat criado em Java continuando execução. [RESOLVIDO]

Oi pessoal, se alguém souber como ajudar num problema, agradeço.

Tenho um programa em Java que escreve um arquivo .bat que é executado num servidor windows server.

Esse .bat faz a instalação de serviços automaticamente, porém, quando ao instalar/desinstalar um serviço é mostrada a janelinha de “installed successfuly” onde deve-se pressionar o botão de ok. Como a instalação é automática, essa janela deve ser fechada automaticamente.

  • Tenho um executável testado que fecha essa janela(janela ativa).
  • Chamo esse .exe de dentro do .bat, mas a execução da batch não continua.
  • O .exe chega a ser executado, mas o comando imediatamente posterior não é executado, pois deve ficar esperando o fim da execução do .exe, que só ocorrerá ao surgir a janelinha de “installed successfuly” que não surge, pois isso ocorreria com o comando seguinte.
    Abaixo segue o trecho do .bat para entenderem melhor.

echo Parando o serviço JDIPSTAV03ReceptorProd --> OK net stop "JDIPSTAV03ReceptorProd" --> OK echo Executando o programa que fecha a janela ativa do comando -uninstall --> OK start "F_Ativa.exe" /SEPARATE /HIGH F_Ativa.exe --> OK mas, nesse ponto fica travado, não executa o comando seguinte. echo O programa 'F_Ativa.exe' foi executado, aguardando a janela ativa 'Information'...SJDIPSTAV03Receptor.exe --> não executa echo Desinstalando o serviço SJDIPSTAV03Receptor.exe SJDIPSTAV03Receptor.exe -uninstall --> não executa (esse comando abre a janela ativa "installed successfuly" que é fechada pelo .exe)

Já tentei colocar o parâmetro MIN no comando start, mas tb não funcionou.
São vários serviços, logo devem ficar dentro de um loop para:

  • parar o serviço
  • desinstalar
  • fechar a janela ativa
  • copiar o novo serviço
  • repetir o processo para o serviço seguinte.
    Caso alguém tenha uma outra idéia, é bem-vinda.

Se chamar um outro .bat que chama o .exe dá certo?

Flw

Oi Foxlol, tb já tentei isso e não dá certo, ocorre o mesmo problema. A execução fica esperando o término da batch para executar o próximo comando.

Vc não pode realizar a execução diretamente pelo java, (Runtime)? Seria mais simples assim controlar todas as execuções e dependencias…
Outra opção (menos viavel que a primeira, acredito) seria utilizar o ANT, ele pode realizar tanto tarefas sequencias qto fluxos concorrentes.

[]s

Tenta executar através de um command independente:

cmd /c

echo Parando o serviço JDIPSTAV03ReceptorProd --> OK  
net stop "JDIPSTAV03ReceptorProd" --> OK  
echo Executando o programa que fecha a janela ativa do comando -uninstall --> OK  
cmd /c "start F_Ativa.exe /SEPARATE /HIGH F_Ativa.exe" --> OK mas, nesse ponto fica travado, não executa o comando seguinte.   
echo O programa 'F_Ativa.exe' foi executado, aguardando a janela ativa 'Information'...SJDIPSTAV03Receptor.exe  --> não executa  
echo Desinstalando o serviço SJDIPSTAV03Receptor.exe    
cmd /c "SJDIPSTAV03Receptor.exe -uninstall" --> não executa (esse comando abre a janela ativa "installed successfuly" que é fechada pelo .exe)  

[quote]Tenta executar através de um command independente:

cmd /c [/quote]

Oi, também já havia tentado essa opção sem sucesso.

Vc pode usar o comando call… seguido de um sleep pra proxima execução.Não é bonito, mas funciona.

Mas ainda acho que seria mais lógico usar o proprio java para realizar a “coreografia dos serviços”

cristian_clever, tb já tentei o comando call. Aliás, tentei várias combinações e nenhuma funcionou. A questão de usar esse arquivo .bat é que já tem todo um fluxo que funciona assim, e está todo integrado. Mas realmente já não sei mais o que fazer e estou tentando codificar em Java pra testar se funciona pra depois tentar integrar ao código existente.

Esse programa “f_ativa” é a raiz do problema. Por acaso ele consegue fechar o programa ?

Galera, consegui resolver o problema.
O que ocorria era que, em todo o script da bat cada linha faz um redirecionamento para o log da ferramenta de distribuição.
(comando >> %1 2>&1)
A linha em que chamava o executável tentava redirecionar para o log, só que a linha somente mandaria o log quando o comando seguinte fosse executado e nunca seria executado porque o comando anterior esperava a execução do comando seguinte. Somente após milhões de testes consegui identificar essa situação que agora me parece óbvia, foi só retirar o redirecionamento.
Agradeço a todos pela tentativa de ajuda.

Aliás, preciso codificar o programa para pegar a janela ativa cujo nome tenha “Information” se der sucesso na instalação ou “Error” se der erro. Tentei montar um condicional para pegar os 2 tipos, mas não funciona. Caso alguém conheça ou saiba como codificar, dá uma dica.
Abaixo segue o código para quem um dia precisar, é preciso instalar o programa AutoIt.


abs.

[code]; V2.64 to V3.0.100 (Version 1.0.6)
; Converted with AutoItV2toV3 [Version 1.0.6]
; © Copyright 2004 J-Paul Mesnage.

; Prologue ; should be renamed (?) and called somewhere if you are converting an include file
;__init()
; End Prologue

; AutoIt Version: 2.63
; Language: US English
; Platform: Windows
; Author: Barack Obama
;
; Script Function:
; Fechar tela ativa Windows
;
AutoItSetOption ( “SendKeyDelay”, 250 )
AutoItSetOption ( “WinWaitDelay”, 1000 )
Sleep ( 2000 )
WinWaitActive ( ‘Information’ )
Send ( ‘{ENTER}’ )
Sleep ( 500 )
Exit[/code]

Desculpe ressucitar o tópico, mas como que desativa essa redirecionamento?

Cara, na minha opinião, não há problemas em ressucitar tópicos. A questão aqui é que não lembro direito, pois mudei de empresa e não mexo mais com essas bats.
Mas, tente entender a sintaxe do comando abaixo (comando DOS) que com certeza vc entenderá como se tira o redirecionamento. Procure no Google sobre comandos DOS

(comando >> %1 2>&1)

Pelo que posso lembrar, as setas “>” (sinal de maior) é que fazem o redirecionamento para onde se deseja (os números 1 ou 2 são tipos de entrada e saída do comando), nesse meu caso, retirei a linha acima do código que eu tinha, pois o sinal “>>” que fazia o redirecionamento, mas não lembro o significado da sintaxe do comando.

Espero que as dicas tenham ajudado.

Bom vlw pelas respostas.

Achei a solução fazendo o seguinte:

comando | cmd /c exit

Ah! e vai mais uma dica, para quem quiser abrir a janela do CMD para exibir a execução do bat, basta fazer:

Runtime.getRuntime().exec("cmd /c start ARQUIVO.bat");

Muito obrigado