Executar Comando no prompt sem perder a sessão

Bom, eis o meu problema:

Preciso criar um script que execute um comando via prompt do MSDOS, esse comando é uma conexão a um programa, após executado é como se eu estivesse logado no sistema.
Após esse comando preciso executar outro comando via prompt também.

Não posso usar um .bat com os 2 comandos pois o segundo comando só é executado após finalizar a conexão com o programa ( ele entendo como o fim do comando anterior).

Tentei o seguinte script:


try {
 // aqui executo o comando q faz a conexao e teoricamente deve me retornar a sessao com o programa externo
			process = Runtime.getRuntime().exec(command.toString());
 //aqui estou pegando o output do processo
			BufferedOutputStream buff = new BufferedOutputStream(process.getOutputStream());
// linha que preciso executar depois de estar conectado
			String submit = "submittask task.xml";
			String exit = "exit";
			try {
  //tento passar o comando q preciso
				buff.write(submit.getBytes());
        // aqui o comando para fechar a sessão
				buff.write(exit.getBytes());
				buff.flush();
				buff.close();

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
//espero pelo processo terminar
				process.waitFor();

			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

sem o buff.close() ele fica executando infinitamente.
com o buff.close() ele da um erro no programa q estou executando pelo prompt
Quando passo a String “exit” é esperado que ele saia da “sessão” do programa e libere o prompt para finalizar a rotina e volte a execução normal do script.

Olá,

Acho que resolveria com as seguintes alterações:

  • Adicionar uma quebra de linha ao final dos comandos (\n)
  • Dar um flush no stream após envio do primeiro comando.

Mas para tornar as coisas mais simples… isso precisa mesmo ser em Java? Com .bat dá para fazer sim!
Primeiro crie um arquivo texto com os comandos (vamos chama-lo de comandos.txt):

submittask task.xml
exit

Depois chame o programa, passando os dados desse arquivo como input, da seguinte forma:

type comandos.txt | programa_a_ser_chamado.exe

Valeu a dica gomesrod
Acho que resolveu parte do meu problema.
Executei o comando no prompt e funcionou.
Porém no java ele não está dando certo, não retorna erro ou fica trancado, simplesmente finaliza a execução.
Meu código ficou assim:


String command="cmd /c  type \tasks\alchemi\cropsim\comandos.txt | \tasks\alchemi\cropsim\alchemi_jsub.exe localhost 9000 admin admin";

//try
process = Runtime.getRuntime().exec(command.toString());

//try
process.waitFor();

//catch

//catch

comando.txt tem as duas linhas

submittask task.xml
exit

Ao chamar de dentro do Java sinceramente eu não sei o que acontece… se ele se perde com os parâmetros do cmd, ou com os redirecionamentos de input…

Tente chamar assim, isolando o exe dos argumentos:

String[] command = { "cmd", "/c", "type \tasks\alchemi\cropsim\comandos.txt | \tasks\alchemi\cropsim\alchemi_jsub.exe localhost 9000 admin admin"}; process = Runtime.getRuntime().exec(command.toString());

Se não der certo, também pode tentar colocar em um .bat e chamar esse .bat

Consegui!!!

Na verdade o que acontecia era o seguinte:
Como eu executava a linha type \tasks\alchemi\cropsim\comandos.txt | \tasks\alchemi\cropsim\alchemi_jsub.exe localhost 9000 admin admin no prompt de dentro da pasta onde estavam os arquivos, tudo funcionava bem. Porém quando o java executava a linha ele estava em um local diferente da pasta o que gera erro na hora em que o programa procurava os arquivos dentro do meu task.xml.

O que fiz foi colocar o caminho completo dos arquivos dentro do xml, outra forma seria executar o comando cd para entrar dentro da pasta certa e de lá executar o programa, mas não testei isso.

resumindo: colocar o caminho completo em todos os arquivos que são chamados resolve problema.

Bom era isso, tentei explicar bem o meu problema e solução. Caso alguém passe pelo mesmo problema acredito que consiga resolver lendo isso.

Muito obrigado gomesrod, tanto pelo interesse em me ajudar quanto pela ajuda propriamente dita.