Execute comandos cmd por meio de java

Eu encontrei vários trechos de código para executar comandos cmd através da class java, mas eu não consegui, este código para abrir o cmd

public void excCommand(String new_dir){ Runtime rt = Runtime.getRuntime(); try { rt.exec(new String[]{"cmd.exe","/c","start"}); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

E eu encontrei outros links para adicionar outros comandos, como cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java

Como abrir o prompt de comando e inserir comandos usando Java?

Alguém pode me ajudar a entender que … como eu posso cd um diretório como:

  cd C:\Program Files\Flowella 

em seguida, execute outros comandos nesse diretório.

Uma maneira de executar um processo de um diretório diferente para o diretório de trabalho do seu programa Java é alterar o diretório e, em seguida, executar o processo na mesma linha de comando. Você pode fazer isso obtendo cmd.exe para executar uma linha de comando, como cd some_directory && some_program .

O exemplo a seguir muda para um diretório diferente e executa dir partir daí. Evidentemente, eu poderia apenas dir esse diretório sem precisar cd para isso, mas isso é apenas um exemplo:

 import java.io.*; public class CmdTest { public static void main(String[] args) throws Exception { ProcessBuilder builder = new ProcessBuilder( "cmd.exe", "/c", "cd \"C:\\Program Files\\Microsoft SQL Server\" && dir"); builder.redirectErrorStream(true); Process p = builder.start(); BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while (true) { line = r.readLine(); if (line == null) { break; } System.out.println(line); } } } 

Note também que estou usando um ProcessBuilder para executar o comando. Entre outras coisas, isso me permite redirect o erro padrão do processo para sua saída padrão, chamando redirectErrorStream(true) . Fazer isso me dá apenas um stream para ler.

Isso me dá a seguinte saída na minha máquina:

 C:\Users\Luke\StackOverflow>java CmdTest Volume in drive C is Windows7 Volume Serial Number is D8F0-C934 Directory of C:\Program Files\Microsoft SQL Server 29/07/2011 11:03  . 29/07/2011 11:03  .. 21/01/2011 20:37  100 21/01/2011 20:35  80 21/01/2011 20:35  90 21/01/2011 20:39  MSSQL10_50.SQLEXPRESS 0 File(s) 0 bytes 6 Dir(s) 209,496,424,448 bytes free 

Você pode tentar isso:

 Process p = Runtime.getRuntime().exec(command); 

Se você quiser executar ações como o cd , use:

 String[] command = {command_to_be_executed, arg1, arg2}; ProcessBuilder builder = new ProcessBuilder(command); builder = builder.directory(new File("directory_location")); 

Exemplo:

 String[] command = {"ls", "-al"}; ProcessBuilder builder = new ProcessBuilder(command); builder = builder.directory(new File("/ngs/app/abc")); Process p = builder.start(); 

É importante dividir o comando e todos os argumentos em strings separadas da matriz de strings (caso contrário, eles não serão fornecidos corretamente pela API ProcessBuilder ).

Meu exemplo (do projeto real)

pasta – Arquivo.

zipFile, filesString – String;

  final String command = "/bin/tar -xvf " + zipFile + " " + filesString; logger.info("Start unzipping: {} into the folder {}", command, folder.getPath()); final Runtime r = Runtime.getRuntime(); final Process p = r.exec(command, null, folder); final int returnCode = p.waitFor(); if (logger.isWarnEnabled()) { final BufferedReader is = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = is.readLine()) != null) { logger.warn(line); } final BufferedReader is2 = new BufferedReader(new InputStreamReader(p.getErrorStream())); while ((line = is2.readLine()) != null) { logger.warn(line); } } 

A maneira mais fácil seria usar Runtime.getRuntime.exec() .

Por exemplo, para obter um valor de registro para o navegador padrão no Windows:

 String command = "REG QUERY HKEY_CLASSES_ROOT\\http\\shell\\open\\command"; try { Process process = Runtime.getRuntime().exec(command); } catch (IOException e) { e.printStackTrace(); } 

Em seguida, use um Scanner para obter a saída do comando, se necessário.

 Scanner kb = new Scanner(process.getInputStream()); 

Nota : o \ é um caractere de escape em uma String , e deve ser escapado para funcionar corretamente (daí o \\ ).


No entanto, não há nenhum executável chamado cd , porque ele não pode ser implementado em um processo separado.

O único caso em que o diretório de trabalho atual é importante está executando um processo externo (usando ProcessBuilder ou Runtime.exec() ). Nesses casos, você pode especificar o diretório de trabalho a ser usado para o processo recém-iniciado explicitamente.

Maneira mais fácil para o seu comando:

 System.setProperty("user.dir", "C:\\Program Files\\Flowella"); 

Depois de obter a referência ao Process, você pode chamar getOutpuStream para obter a input padrão do prompt do cmd. Em seguida, você pode enviar qualquer comando pelo stream usando o método write como em qualquer outro stream.

Observe que é process.getOutputStream () que está conectado ao stdin no processo gerado. Da mesma forma, para obter a saída de qualquer comando, você precisará chamar getInputStream e, em seguida, ler sobre isso como qualquer outro stream de input.

Você não pode rodar o cd desta forma, porque o cd não é um programa real; é uma parte interna da linha de comando e tudo o que faz é alterar o ambiente da linha de comando. Não faz sentido executá-lo em um subprocess, porque você está alterando o ambiente desse subprocess – mas esse subprocess se fecha imediatamente, descartando seu ambiente.

Para definir o diretório de trabalho atual em seu programa Java real, você deve escrever:

 System.setProperty("user.dir", "C:\\Program Files\\Flowella"); 

Tente isto:

 Process runtime = Runtime.getRuntime().exec("cmd /c start notepad++.exe"); 

Aqui está uma implementação mais completa da execução da linha de comando.

Uso

 executeCommand("ls"); 

Saída:

 12/27/2017 11:18:11:732: ls 12/27/2017 11:18:11:820: build.gradle 12/27/2017 11:18:11:820: gradle 12/27/2017 11:18:11:820: gradlew 12/27/2017 11:18:11:820: gradlew.bat 12/27/2017 11:18:11:820: out 12/27/2017 11:18:11:820: settings.gradle 12/27/2017 11:18:11:820: src 

Código

 private void executeCommand(String command) { try { log(command); Process process = Runtime.getRuntime().exec(command); logOutput(process.getInputStream(), ""); logOutput(process.getErrorStream(), "Error: "); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); } } private void logOutput(InputStream inputStream, String prefix) { new Thread(() -> { Scanner scanner = new Scanner(inputStream, "UTF-8"); while (scanner.hasNextLine()) { synchronized (this) { log(prefix + scanner.nextLine()); } } scanner.close(); }).start(); } private static SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss:SSS"); private synchronized void log(String message) { System.out.println(format.format(new Date()) + ": " + message); } 

A maneira mais simples e mais rápida é usar a biblioteca CmdTool .

 new Cmd() .configuring(new WorkDir("C:/Program Files/Flowella")) .command("cmd.exe", "/c", "start") .execute(); 

Você pode encontrar mais exemplos aqui .