コマンドプロンプト(および他のシステム用のその他の端末)を開き、新しく開いたウィンドウでコマンドを実行することは可能ですか?
現在私が持っているのはこれです:
Runtime rt = Runtime.getRuntime();
rt.exec(new String[]{"cmd.exe","/c","start"});
「開始」の後に次のコマンドを追加しようとしました。コマンドを含む別のrt.execを実行しようとしましたが、機能させる方法が見つかりません。
問題があれば、次のようなコマンドを実行しようとしています。
Java -flag -flag -cp terminal-based-program.jar
[〜#〜] edit [〜#〜]残念ながら、奇妙な発見がいくつかありました。コマンドプロンプトを正常に起動し、これを使用してコマンドを渡すことができました。
rt.exec("cmd.exe /c start command");
ただし、1つのコマンドでのみ機能するようです。なぜなら、「cmd.exe/c start command&command2」のようなコマンド区切り記号を使用しようとすると、2番目のコマンドがバックグラウンドを通過するからです(rt.exec( "command2")を使用した場合のように)。 。ここでの問題は、コマンドプロンプトが実行されているディレクトリを変更する必要があることに気づいたことです。なぜなら、jarファイルへのフルパスを使用すると、jarファイルはコマンドプロンプトのActive Directoryからではなく間違ってデータを読み取るためですリソースを含むjarのディレクトリ。
私は人々がrt.exec(String)から離れることを推奨していることを知っていますが、これは機能し、配列バージョンに変更する方法がわかりません。
rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"Java -flag -flag -cp terminal-based-program.jar\"");
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());
}
}
コマンドプロンプトが実行されるディレクトリを変更するためだけに2つのコマンドを同時に実行している場合、現在の作業ディレクトリを指定できるRuntime.execメソッドのオーバーロードがあります。のように、
Runtime rt = Runtime.getRuntime();
rt.exec("cmd.exe /c start command", null, new File(newDir));
これにより、newDirのディレクトリでコマンドプロンプトが開きます。あなたのソリューションもうまくいくと思いますが、これによりコマンド文字列または配列が少しきれいになります。
コマンドを文字列として使用し、コマンドを文字列配列として使用するためのオーバーロードがあります。
ただし、現在の作業ディレクトリを設定するdirectory
メソッドを持つ ProcessBuilder を使用すると、さらに簡単になります。
お役に立てれば。
Snow Leopardでは次のように機能します。
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が引数の順序を解釈して「新しいコマンドプロンプトを開始する」ことを意味しない場合もあります。配列はおそらく次のようになります。
{「開始」、「cmd.exe」、「\ c」}
新しいコマンドプロンプトでコマンドを開くには、プロセス参照を使用する必要があります。しかし、私の前の人がコメントしたように、単にexecを使用できるのになぜあなたがそれをしたいのか分かりません。
渡す文字列の開始後にコマンドを追加するだけです。
String command = "cmd.exe /c start "+"*your command*";
Process child = Runtime.getRuntime().exec(command);
以下のようなパラメーターにコマンドを配置してください。
Runtime.getRuntime().exec("cmd.exe /c start cmd /k \" parameter \"");
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();
コマンドプロンプトの動的パスにonプロセスを使用できます
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");
すべてを設定する必要があります\"
(引用符)慎重に。パラメーター\k
は、実行後にコマンドプロンプトを開いたままにするために使用されます。
1)2つのコマンドを組み合わせて使用する(たとえば、pause
とipconfig
)
Runtime.getRuntime()
.exec("cmd /c start cmd.exe /k \"pause && ipconfig\"", null, selectedFile.getParentFile());
2)ファイル使用のコンテンツを表示する(MORE
はWindowsのコマンドラインビューアーです)
File selectedFile = new File(pathToFile):
Runtime.getRuntime()
.exec("cmd /c start cmd.exe /k \"MORE \"" + selectedFile.getName() + "\"\"", null, selectedFile.getParentFile());
1つのネスト引用符\ "はコマンドとファイル名用で、2番目の引用符\"はファイル名自体、特に名前のスペースなどです。