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
そのディレクトリで他のコマンドを実行しますか?
別のディレクトリから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
これを試すことができます:-
Process p = Runtime.getRuntime().exec(command);
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
APIによって正しく提供されません)。
私の例(実際のプロジェクトから)
フォルダー—ファイル。
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);
}
}
コマンドライン実行のより完全な実装を次に示します。
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);
}
これを試して:
Process runtime = Runtime.getRuntime().exec("cmd /c start notepad++.exe");
最も簡単な方法は、 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");
Processへの参照を取得したら、getOutpuStreamを呼び出して、cmdプロンプトの標準入力を取得できます。その後、他のストリームと同様にwriteメソッドを使用して、ストリーム上でコマンドを送信できます。
生成されたプロセスの標準入力に接続されるのはprocess.getOutputStream()であることに注意してください。同様に、コマンドの出力を取得するには、getInputStreamを呼び出して、これを他の入力ストリームとして読み取る必要があります。
cd
は実際のプログラムではないため、cd
をこの方法で実行することはできません。コマンドラインの組み込み部分であり、コマンドラインの環境を変更するだけです。サブプロセスで環境を変更しているため、サブプロセスで実行することは意味がありませんが、そのサブプロセスはすぐに閉じられ、その環境は破棄されます。
実際のJavaプログラムで現在の作業ディレクトリを設定するには、次のように記述する必要があります。
System.setProperty("user.dir", "C:\\Program Files\\Flowella");
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();
}
}