Вопрос-ответ

Run cmd commands through Java

Запуск команд cmd через Java

Я нашел несколько фрагментов кода для запуска команд cmd через класс Java, но я не смог это понять.

Это код для открытия команды 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();
}
}

И я нашел несколько других ссылок для добавления других команд, таких как cd
http://www.coderanch.com/t/109753/Linux-UNIX/exec-command-cd-command-java

Как открыть командную строку и вставить команды с помощью Java?

Кто-нибудь может помочь мне понять, как создать каталог cd, такой как:

 cd C:\Program Files\Flowella

затем запускать другие команды в этом каталоге?

Переведено автоматически
Ответ 1

Один из способов запустить процесс из другого каталога в рабочий каталог вашей Java-программы - это изменить каталог, а затем запустить процесс в той же командной строке. Вы можете сделать это, заставив cmd.exe запустить командную строку, такую как cd some_directory && some_program.

Следующий пример изменяется на другой каталог и выполняется dir оттуда. По общему признанию, я мог бы просто dir этот каталог без необходимости cd обращаться к нему, но это только пример:

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

Обратите также внимание, что я использую ProcessBuilder для запуска команды. Среди прочего, это позволяет мне перенаправить стандартную ошибку процесса в его стандартный вывод, вызвав redirectErrorStream(true). Это дает мне только один поток для чтения.

Это дает мне следующий результат на моем компьютере:

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 <DIR> .
29/07/2011 11:03 <DIR> ..
21/01/2011 20:37 <DIR> 100
21/01/2011 20:35 <DIR> 80
21/01/2011 20:35 <DIR> 90
21/01/2011 20:39 <DIR> MSSQL10_50.SQLEXPRESS
0 File(s) 0 bytes
6 Dir(s) 209,496,424,448 bytes free
Ответ 2

Вы можете попробовать это:-

Process p = Runtime.getRuntime().exec(command);
Ответ 3

Если вы хотите выполнять действия, подобные cd, то используйте:

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

Пример:

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

Важно, чтобы вы разделили команду и все аргументы на отдельные строки массива string (в противном случае они не будут предоставлены корректно ProcessBuilder API).

Ответ 4

Вот более полная реализация выполнения командной строки.

Использование

executeCommand("ls");

Вывод:

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

Код

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