41

コマンドプロンプトを開いて(そして他のシステム用の他のターミナルを推測します)、新しく開いたウィンドウでコマンドを実行することは可能ですか?

現在私が持っているのはこれです:

Runtime rt = Runtime.getRuntime();
rt.exec(new String[]{"cmd.exe","/c","start"});

「start」の後に次のコマンドを追加しようとしました。コマンドを含む別のrt.execを実行しようとしましたが、それを機能させる方法が見つかりません。

重要な場合は、次のようなコマンドを実行しようとしています。

java -flag -flag -cp terminal-based-program.jar

編集残念ながら、私はいくつかの奇妙な発見がありました。コマンドプロンプトを正常に起動し、次を使用してコマンドを渡すことができました。

rt.exec("cmd.exe /c start command");

ただし、1つのコマンドでしか機能しないようです。「cmd.exe/c start command&command2」のようなコマンドセパレータを使用しようとすると、2番目のコマンドがバックグラウンドで渡されるためです(rt.exec( "command2");を使用した場合と同じように)。 。ここでの問題は、コマンドプロンプトが実行されているディレクトリを変更する必要があることに気付きました。これは、jarファイルへのフルパスを使用すると、jarファイルがコマンドプロンプトのアクティブディレクトリからデータを誤って読み取るためです。リソースを含むjarのディレクトリ。

4

9 に答える 9

28

rt.exec(String)から離れることをお勧めしていることは知っていますが、これは機能し、配列バージョンに変更する方法がわかりません。

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\"");
于 2011-01-15T04:10:31.910 に答える
10

コマンドプロンプトが実行されるディレクトリを変更するためだけに2つのコマンドを同時に実行している場合、現在の作業ディレクトリを指定できるRuntime.execメソッドのオーバーロードがあります。好き、

Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));

これにより、newDirのディレクトリでコマンドプロンプトが開きます。あなたの解決策もうまくいくと思いますが、これはあなたのコマンド文字列や配列を少しきれいに保ちます。

コマンドを文字列として使用し、コマンドを文字列配列として使用するには、過負荷があります。

ただし、現在の作業ディレクトリを設定するメソッドを持つProcessBuilderを使用する方がさらに簡単な場合があります。directory

お役に立てれば。

于 2011-01-16T04:57:43.210 に答える
10
public static void main(String[] args) {
    try {
        String ss = null;
        Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
        BufferedWriter writeer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
        writeer.write("dir");
        writeer.flush();
        BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
        BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        System.out.println("Here is the standard output of the command:\n");
        while ((ss = stdInput.readLine()) != null) {
            System.out.println(ss);
        }
        System.out.println("Here is the standard error of the command (if any):\n");
        while ((ss = stdError.readLine()) != null) {
            System.out.println(ss);
        }

    } catch (IOException e) {
        System.out.println("FROM CATCH" + e.toString());
    }

}
于 2012-06-11T18:10:33.890 に答える
4

以下は、SnowLeopardで私のために機能します。

Runtime rt = Runtime.getRuntime();
String[] testArgs = {"touch", "TEST"};
rt.exec(testArgs);

つまり、そのコマンドの出力を読み取りたい場合は、プロセスの入力ストリームを読み取る必要があります。例えば、

Process pr = rt.exec(arguments);
BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream()));

コマンドの行ごとの出力を非常に簡単に読み取ることができます。

問題は、MS-DOSが引数の順序を「新しいコマンドプロンプトを開始する」ことを意味するように解釈しないことでもある可能性があります。配列はおそらく次のようになります。

{"start"、 "cmd.exe"、 "\ c"}

新しいコマンドプロンプトでコマンドを開くには、プロセスリファレンスを使用する必要があります。しかし、私の前の人がコメントしたように、execを使用できるのに、なぜそれを実行したいかはわかりません。

于 2011-01-14T05:47:30.507 に答える
2

開始後に、渡す文字列にコマンドを追加する必要があります。

String command = "cmd.exe /c start "+"*your command*";

Process child = Runtime.getRuntime().exec(command);
于 2017-05-10T07:13:03.990 に答える
1
String[] command = {"cmd.exe" , "/c", "start" , "cmd.exe" , "/k" , "\" dir && ipconfig 
\"" };
ProcessBuilder probuilder = new ProcessBuilder( command );
probuilder.directory(new File("D:\\Folder1"));
Process process = probuilder.start();
于 2019-02-07T05:37:48.093 に答える
0

下記のようなパラメータにコマンドを入れてください。

Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");
于 2017-12-23T16:01:23.733 に答える
0

コマンドプロンプトで動的パスに任意のオンプロセスを使用できます

Process p = Runtime.getRuntime().exec("cmd.exe /c start dir ");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\rakhee\\Obligation Extractions\" && dir");
Process p = Runtime.getRuntime().exec("cmd.exe /c start cd \"E:\\oxyzen-workspace\\BrightleafDesktop\\Obligation Extractions\" && dir");
于 2018-04-26T07:04:54.567 に答える
0

すべて\"(引用符)を慎重に設定する必要があります。このパラメータ\kは、実行後にコマンドプロンプトを開いたままにするために使用されます。

1)2つのコマンドを組み合わせるには、(たとえばpauseipconfig)を使用します

Runtime.getRuntime()
  .exec("cmd /c start cmd.exe /k \"pause && ipconfig\"", null, selectedFile.getParentFile());

2)ファイルの使用内容を表示する(MOREWindowsのコマンドラインビューアです)

File selectedFile = new File(pathToFile):
Runtime.getRuntime()
  .exec("cmd /c start cmd.exe /k \"MORE \"" + selectedFile.getName() + "\"\"", null, selectedFile.getParentFile());

1つのネストされた引用符\"はコマンドとファイル名を表し、2番目の引用符\"はファイル名自体、特に名前のスペースなどを表します。

于 2019-01-18T09:16:53.437 に答える