Execultar comando cmd via java

Galera, estou mais uma vez precisando de sua ajuda.
gostaria de saber como execultar comando cmd em java
Algoritmo:
*Abrir cmd
*inserir comando nele via variavel
*execultar comando

Esta função você pode utilizar em Java para executar comandos como se estivesse no prompt do DOS (command):

	public synchronized static String execCommand(final String commandLine) throws IOException {

		boolean success = false;
		String result;

		Process p;
		BufferedReader input;
		StringBuffer cmdOut = new StringBuffer();
		String lineOut = null;
		int numberOfOutline = 0;

		try {

			p = Runtime.getRuntime().exec(commandLine);

			input = new BufferedReader(new InputStreamReader(p.getInputStream()));

			while ((lineOut = input.readLine()) != null) {
				if (numberOfOutline > 0) {
					cmdOut.append("\n");
				}
				cmdOut.append(lineOut);
				numberOfOutline++;
			}

			result = cmdOut.toString();

			success = true;

			input.close();
			
		} catch (IOException e) {
			result = String.format("Falha ao executar comando %s. Erro: %s", commandLine, e.toString());
		}

		// Se não executou com sucesso, lança a falha
		if (!success) {
			throw new IOException(result);
		}

		return result;

	}

wiliamps

Meu Deus, pra q tudo isso?

Isso ja resolve

private void exec(){ Process exec; try { exec = Runtime.getRuntime().exec("ipconfig"); if ( exec.waitFor() == 0) System.out.println("Executado."); else System.out.println("ERRO"); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }

que traduzindo é isso

Runtime.getRuntime().exec("ipconfig");  

=]

1 curtida

charleston10, ao invés de tentar desmerecer minha ajuda ao colega, por que você não procura uma outra pessoa que necessita de ajuda?

A função que passei é sincronizada para evitar gerar muitos frames de acesso para comando DOS na JVM, trata a resposta e a retorna corretamente e ainda lança exceção legível para ajudar o usuário.

Não tem nada de perplexo na resposta, apenas procurei tratar o nosso amigo lá como um programador de linha profissional e não um amador.

wiliamps

1 curtida

^^

[quote=charleston10]E voce esqueceu que a classe Runtime, foi feita pra isso?
Quem desenvolveu foi amador? E outra se tem uma classe pronta, é pq minimiza a tarefa, qual vale mais 1000 linhas de codigos ou 10 linhas de codigos que faz a mesma coisa?
Leva em consideração que ninguem vai ver seu código, eu e vc somos anonimos … ^^[/quote]

Presta atenção, cara. Ele usou a classe Runtime na linha 14 do código dele.
A diferença é que ele fez isso do jeito certo, tratando os fluxos de saída (que podem travar o processo se não forem tratados).

Uma modificação interessante no método dele seria passar por parâmetro o PrintWriter para qual o output será jogado. E então retornar o inteiro retornado pelo método waitFor:

	public synchronized static String execCommand(final String commandLine, PrintWriter out) {
		Process p = Runtime.getRuntime().exec(commandLine);
		BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

		String lineOut;
		while ((lineOut = input.readLine()) != null) {
		    out.println(lineOut);
		}
		input.flush();                
		input.close();
		return p.waitFor();
	}

Esse inteiro é o código de retorno do processo. Outra variação seria também tratar o error stream.

1 curtida

Boua…

E que tal assim?

import java.io.IOException;
import java.util.Scanner;

public class Programa {
	public static void main(String[] args) {
		try {
			Process process = Runtime.getRuntime().exec("ipconfig");
			Scanner leitor = new Scanner(process.getInputStream());
			while (leitor.hasNextLine()) {
				System.out.println(leitor.nextLine());
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
2 curtidas

Também é válido. Mas você parte do pressuposto que o outputstream será sempre texto (o que é válido nesse caso, mas nem sempre), e que a saída será “bem comportada” (sempre terminando no \n). Algumas vezes os processos não colocam o \n no último texto escrito.

Faltou também chamar o waitFor().

Outra coisa. Evite ressuscitar tópicos muito antigos. Esse era de 2012.

1 curtida