Подтвердить что ты не робот

Выполнять команды 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 C:\Program Files\Flowella

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

4b9b3361

Ответ 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,argument};
ProcessBuilder builder = new ProcessBuilder(command);
builder.directory(new File("directory_location"));

Пример:

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

Ответ 4

Самый простой способ - использовать Runtime.getRuntime.exec().

Например, чтобы получить значение реестра для браузера по умолчанию в Windows:

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

Затем используйте Scanner для получения вывода команды, если это необходимо.

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

Примечание: \ является escape-символом в String и должен быть экранирован для правильной работы (следовательно, \\).


Однако нет исполняемого файла под названием cd, потому что он не может быть реализован в отдельном процессе.

В случае, когда текущая рабочая директория имеет значение, выполняется внешний процесс (с помощью ProcessBuilder или Runtime.exec()). В этих случаях вы можете явно указать рабочий каталог, который будет использоваться для вновь запущенного процесса.

Самый простой способ для вашей команды:

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

Ответ 5

Мой пример (из реального проекта)

папка - Файл.

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

Ответ 6

Как только вы получите ссылку на Process, вы можете вызвать getOutpuStream на нем, чтобы получить стандартный ввод команды cmd. Затем вы можете отправить любую команду над потоком, используя метод записи, как с любым другим потоком.

Обратите внимание, что это process.getOutputStream(), который связан с stdin на порожденном процессе. Аналогично, чтобы получить вывод любой команды, вам нужно будет вызвать getInputStream, а затем прочитать это как любой другой входной поток.

Ответ 7

Вы не можете запустить cd таким образом, потому что cd не является реальной программой; это встроенная часть командной строки, и все, что она делает, это изменение среды командной строки. Не имеет смысла запускать его в подпроцессе, потому что тогда вы меняете среду подпроцесса — но этот подпроцесс немедленно закрывается, отбрасывая его среду.

Чтобы установить текущий рабочий каталог в вашей реальной программе Java, вы должны написать:

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

Ответ 8

Попробуйте следующее:

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

Ответ 9

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

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

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