Esegui comandi cmd tramite java

Ho trovato diversi frammenti di codice per l’esecuzione di comandi cmd attraverso la class java, ma non riuscivo a ottenerlo, Questo codice per aprire il 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 ho trovato un altro link per aggiungere altri comandi come cd http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java

Come aprire il prompt dei comandi e inserire i comandi utilizzando Java?

Qualcuno può aiutarmi a capire che … come posso cd una directory come:

  cd C:\Program Files\Flowella 

quindi eseguire altri comandi su quella directory.

Un modo per eseguire un processo da una directory diversa alla directory di lavoro del programma Java consiste nel cambiare la directory e quindi eseguire il processo nella stessa riga di comando. È ansible farlo cd some_directory && some_program cmd.exe per eseguire una riga di comando come cd some_directory && some_program .

L’esempio seguente cambia in una directory diversa e avvia dir da lì. Certo, potrei semplicemente dir quella directory senza doverlo cd , ma questo è solo un esempio:

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

Nota anche che sto usando un ProcessBuilder per eseguire il comando. Tra l’altro, questo mi consente di redirect l’errore standard del processo nel suo output standard, chiamando redirectErrorStream(true) . In questo modo mi dà solo un stream da cui leggere.

Questo mi dà il seguente risultato sulla mia macchina:

 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 

Puoi provare questo: –

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

Se vuoi eseguire azioni come cd , usa:

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

Esempio:

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

È importante dividere il comando e tutti gli argomenti in stringhe separate dell’array di stringhe (altrimenti non verranno forniti correttamente dall’API ProcessBuilder ).

Il mio esempio (dal vero progetto)

cartella – File.

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

Il modo più semplice sarebbe utilizzare Runtime.getRuntime.exec() .

Ad esempio, per ottenere un valore di registro per il browser predefinito su Windows:

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

Quindi utilizzare uno Scanner per ottenere l’output del comando, se necessario.

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

Nota : il \ è un carattere di escape in una String e deve essere sottoposto a escape per funzionare correttamente (da qui il \\ ).


Tuttavia, non esiste un eseguibile chiamato cd , perché non può essere implementato in un processo separato.

Il caso in cui è importante la directory di lavoro corrente è l’esecuzione di un processo esterno (utilizzando ProcessBuilder o Runtime.exec() ). In questi casi è ansible specificare la directory di lavoro da utilizzare esplicitamente per il processo appena avviato.

Il modo più semplice per il tuo comando:

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

Una volta ottenuto il riferimento a Process, è ansible richiamare getOutpuStream su di esso per ottenere lo standard input del prompt cmd. Quindi puoi inviare qualsiasi comando sullo stream usando il metodo write come con qualsiasi altro stream.

Si noti che è process.getOutputStream () che è connesso allo stdin nel processo spawn. Allo stesso modo, per ottenere l’output di qualsiasi comando, è necessario chiamare getInputStream e leggerlo come qualsiasi altro stream di input.

Non è ansible eseguire cd questo modo, perché cd non è un vero programma; è una parte incorporata della riga di comando e tutto ciò che fa è cambiare l’ambiente della riga di comando. Non ha senso eseguirlo in un sottoprocesso, perché in questo modo si sta modificando l’ambiente di tale processo, ma tale sottoprocesso si chiude immediatamente, scartando il proprio ambiente.

Per impostare la directory di lavoro corrente nel tuo attuale programma Java, dovresti scrivere:

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

Prova questo:

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

Ecco un’implementazione più completa dell’esecuzione della riga di comando.

uso

 executeCommand("ls"); 

Produzione:

 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 

Codice

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

Il modo più semplice e più breve è usare la libreria CmdTool .

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

Puoi trovare altri esempi qui .