web-dev-qa-db-ja.com

Javaを介してcmdコマンドを実行します

Javaクラスを介してcmdコマンドを実行するためのコードスニペットをいくつか見つけましたが、それを理解できませんでした。

これは、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

そのディレクトリで他のコマンドを実行しますか?

48
Reham

別のディレクトリからJavaプログラムの作業ディレクトリにプロセスを実行する1つの方法は、ディレクトリを変更してから同じコマンドラインでプロセスを実行することです。これを行うには、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)を呼び出すことにより、プロセスの標準エラーを標準出力にリダイレクトできます。これにより、読み取り元のストリームが1つだけになります。

これにより、マシン上で次の出力が得られます。

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
119
Luke Woodward

これを試すことができます:-

Process p = Runtime.getRuntime().exec(command);
9
Rahul Tripathi

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

コマンドとすべての引数を文字列配列の別々の文字列に分割することが重要です(そうしないと、ProcessBuilder AP​​Iによって正しく提供されません)。

6
Ashwini Sinha

私の例(実際のプロジェクトから)

フォルダー—ファイル。

zipFile、filesString —ストリング;

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

コマンドライン実行のより完全な実装を次に示します。

使用法

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);
}
3
Ilya Gazman

これを試して:

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

最も簡単な方法は、 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());

\Stringのエスケープ文字であり、適切に動作するためにエスケープする必要があります(したがって\\) 。


ただし、cdという実行可能ファイルはありません。別のプロセスで実装することはできないためです。

現在の作業ディレクトリが重要なケースの1つは、外部プロセスの実行です( ProcessBuilder または Runtime.exec() を使用)。そのような場合、新しく開始されたプロセスに使用する作業ディレクトリを明示的に指定できます。

コマンドの最も簡単な方法:

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

Processへの参照を取得したら、getOutpuStreamを呼び出して、cmdプロンプトの標準入力を取得できます。その後、他のストリームと同様にwriteメソッドを使用して、ストリーム上でコマンドを送信できます。

生成されたプロセスの標準入力に接続されるのはprocess.getOutputStream()であることに注意してください。同様に、コマンドの出力を取得するには、getInputStreamを呼び出して、これを他の入力ストリームとして読み取る必要があります。

1
Akhilesh Singh

cdは実際のプログラムではないため、cdをこの方法で実行することはできません。コマンドラインの組み込み部分であり、コマンドラインの環境を変更するだけです。サブプロセスで環境を変更しているため、サブプロセスで実行することは意味がありませんが、そのサブプロセスはすぐに閉じられ、その環境は破棄されます。

実際のJavaプログラムで現在の作業ディレクトリを設定するには、次のように記述する必要があります。

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

Javaからcmdを実行する方法の1つ!

public void executeCmd() {
    String anyCommand="your command";
    try {
        Process process = Runtime.getRuntime().exec("cmd /c start cmd.exe /K " + anyCommand);

    } catch (IOException e) {
        e.printStackTrace();
    }
}
0
Energy

最も簡単で短い方法は、 CmdTool libraryを使用することです。

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

より多くの例を見つけることができます こちら

0