JAVA conversando com arquivos .bat

Bom dia, quero fazer com que dados que serão obtidos através de uma interface java sejam enviados para um arquivo .bat, que lerá os dados e iniciará o processo.

O problema que tenho que resolver é o seguinte:

Quero iniciar uma conexão VPN com o OpenVPN com o seguinte comando.

Arquivo: start.bat

cd %PROGRAMFILES%\OpenVPN\config
openvpn --config client.ovpn

Mas, não quero utilizar a interface do PROMPT-DOS, então quero que o bytecode resgate os dados digitados pelo usuários através desta interface JAVA e que inicie o arquivo .bat com estes dados.

Não sei se fui claro.

Gostaria de saber se é possível.

Obrigado!

Runtime.getRuntime().exec("start.bat ");

Você pode concatenar os parâmetros para a String passada.

Algo como:

String programFiles = System.getenv ("PROGRAMFILES");
File directory = new File (new File (programFiles), "OpenVPN\config");
// http://download-llnw.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec%28java.lang.String[],%20java.lang.String[],%20java.io.File%29
Process proc = Runtime.getRuntime().exec (
     new String[] {"openvpn", "--config", "client.ovpn"}, 
     null,
     directory);

[quote=tiagogn]Runtime.getRuntime().exec("start.bat ");

Você pode concatenar os parâmetros para a String passada.[/quote]

Isso não funciona, porque start.bat não é um executável, precisando ser interpretado pelo cmd.exe. Use algo como “cmd.exe /c start.bat”

Oi,

Não é possível rodar um aplicativo bat por Runtime.

Nem com chamando o cmd antes, conforme o entanglement falou…

Tchauzin!

[quote=lina]Oi,

Não é possível rodar um aplicativo bat por Runtime.

Nem com chamando o cmd antes, conforme o entanglement falou…

Tchauzin![/quote]

Opa é possível sim, é só fazer da seguinte forma:

public class ExecutaBat {
	
	private final String bat = "c:\inicia_vpn.bat";
	

	public void executar(){
		try {
			Runtime.getRuntime().exec("cmd /c start /B "+bat);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	public static void main(String[] args){
		new ExecutaBat().executar();
	}
	
}

Boa sorte!

Bom, eu uso o Bat To Exe Converter,

convertendo o arquivo bat pra exe dah pra usar o Runtime.getRuntime().exec()

vlw!!

Legal, gostei das propostas, agora ja sei que é possível fazer o que eu estou pensando.

Mas quando compilo e executo a Classe do OliveirakunJava, nada acontece, estou utilizando o eclipse.

[quote=chicogodoy.evo]Legal, gostei das propostas, agora ja sei que é possível fazer o que eu estou pensando.

Mas quando compilo e executo a Classe do OliveirakunJava, nada acontece, estou utilizando o eclipse.[/quote]

Vc deve colocar o caminho do arquivo na variável bat. O arquivo .bat vai ser executado em modo silencioso(sem aparecer a janela do prompt do ms-dos), se vc quiser ver a janela para ter certeza de que o arquivo foi executado basta retirar o parâmetro /B na linha: ("cmd /c start /B "+bat)

Utilizo o .bat para ser executar pelo pronpt, não sabia que o bytecode conseguia fazer o mesmo, este tópico me ajudou bastante!

Vou tentar executa-lo desta forma nas próximas vezes que eu precisar, ao invés de utilizar pelo prompt!

[quote=andredemelo]Utilizo o .bat para ser executar pelo pronpt, não sabia que o bytecode conseguia fazer o mesmo, este tópico me ajudou bastante!

Vou tentar executa-lo desta forma nas próximas vezes que eu precisar, ao invés de utilizar pelo prompt![/quote]

Não é o bytecode que faz isso, e sim o “cmd”(shell do windows). A solução postada atraz apenas pede ao cmd.exe para executar seu script.

Legal, é verdade, o “/B” oculta a execução, entretanto se eu preciso inserir um usuário e senha, pois estou testando VPNs com certificados.

Observem na imagem o que acontece ao desocultar a execução do arquivo .bat

Preciso inserir um usuário e senha que o usuário irá digitar na execução do arquivo.

É possível?

Obrigado por esclarecer juliocbq, então faço de uma outra forma, que também executa o .bat!
Ele tembém executa pelo “cmd”.

O “.bat” é útil pra mim para que eu efetue scripts de filmagens dos sistemas desenvolvidos, utilizando o SeleniumServer, para a equipe de qualidade!

Especifica o usuário e a senha no “.bat” criado.

Oi,

Alguém ai realmente conseguiu executar o .bat ?

Porque aqui não deu certo com nenhuma opção. E olha que já tentei todas!

Tchauzin!

Não dá, pois quando executo este client.ovpn entre em uma instância do OpenVPN.

Ou seja, as próximas linhas de comando só serão executadas após o término da instância.

Ex.:

tenho um .bat seguinte:

=============== INICIO BAT ===============
cd %PROGRAMFILES%\OpenVPN\config
openvpn --config client.ovpn [color=red]// Aqui executo o arquivo (dentro desta execução o PROMPT me pede usuário e senha).[/color]

usuario [color=red]// Ao executar esta linha estou fora do arquivo.[/color][color=red] [/color]

senha [color=red]// Ao executar esta linha estou fora do arquivo.[/color][color=red] [/color]
=============== FIM BAT ===============

[quote=lina]Oi,

Alguém ai realmente conseguiu executar o .bat ?

Porque aqui não deu certo com nenhuma opção. E olha que já tentei todas!

Tchauzin![/quote]

Oii, consegui sim.
Só que o .bat está sendo executado em background, retire o parâmetro “/B” conforme indico abaixo.

============= Método executar ================
public void executar(){
try {
Runtime.getRuntime().exec(“cmd /c start [color=red]/B[/color]” + bat);
System.out.println(“user1”);
System.out.println(“123”);
} catch (IOException e) {
System.out.println("ERRO: ");
e.printStackTrace();
}
============= Método executar ================

E execute novamente!

[quote=chicogodoy.evo]
Preciso inserir um usuário e senha que o usuário irá digitar na execução do arquivo.

É possível?[/quote]

É sim mas é um pouco mais complicado. O comando Runtime.getRuntime.exec() retorna um processo, vc vai ter que pegar esse processo retornado e abrir um stream de entrada e saida para ler e enviar dados, muito parecido com sockets. Vai ficar mais ou menos assim:

Process pr = Runtime.getRuntime().exec("cmd /c start /B "+bat);
PrintStream output = new PrintStream(pr.getOutputStream());
Scanner scanner = new Scanner(pr.getInputStream());

output.println("User");//escrevendo dados no stream

System.out.println(scanner.nextLine());//imprimindo a saida dos dados

O ideal é vc criar uma thread separada para ler a saida dos dados e enviar os comandos pela thread principal, se vc ja trabalhou com sockets não vai ter problemas.

Lina, tenta executar o código que eu postei mas sem o parâmetro /B na linha do runtime.exec(), dessa forma a janela de prompt aparecerá na tela. No caso essa linha ficaria dessa forma:

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

E se vc utilizar o ‘Selenium Server’ para simular a autentificação? Criando um ‘.jar’ com a execução do login e senha por um .bat?

Iiiiii… ai ferrou…
Nunca trabalhei com Sockets.
Vou testar esse código.

Existe algum tutorial específico para isso?

PS.: Valeu a todos pela ajuda, de fato que todos ajudaram na minha questão, afinal, agora sei que é possível.