JAVA conversando com arquivos .bat

23 respostas
C

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!

23 Respostas

T

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

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

E

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);
E

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

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

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”

L

Oi,

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

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

Tchauzin!

O

lina:
Oi,

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

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

Tchauzin!

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!

C

Bom, eu uso o Bat To Exe Converter,

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

vlw!!

C

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.

O

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.

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)

A

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!

J

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!

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.

C

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?

A

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!

A

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

L

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!

C

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 ===============

C

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!

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!

O

chicogodoy.evo:

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

É possível?

É 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);
A

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?

C

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.

C

Ai que tá… é a primeira vez que escuto esse nome

heheheh…

vou ter que estudar sobre o Seleniu Server.

Mas valeu pela dica!

O

chicogodoy.evo:

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.

Na apostila FJ-11 da Caelum tem bons exemplos de sockets:http://www.caelum.com.br/apostilas/
Boa sorte!

A

Se te ajudar, acompanha este blog aqui, que nele tem vários post bem legais sobre o selenium!!

http://www.seuenium.com.br/

Tem também o site do Slenium RC, se tiver interece

http://seleniumhq.org/docs/05_selenium_rc.html

Boa Sorte e qualquer coisa só postar, que se eu puder te ajudar estarei por aqui dnovo!

C

Ok galera, agora é trabalho, vou ter que estudar mesmo, valeu pelas dicas e muito obrigado por esclarecerem as minhas dúvidas.

Valeu mesmo!!

Meus objetivos foram alcançados, agora ja sei o que fazer.

Abs.

Criado 5 de outubro de 2010
Ultima resposta 5 de out. de 2010
Respostas 23
Participantes 8