web-dev-qa-db-ja.com

Java runtime?を使用した「cd」コマンドの使用方法

Ubuntu 10.04ターミナルで「cd」コマンドを使用してディレクトリを変更しようとするスタンドアロンJavaアプリケーションを作成しました。次のコードを使用しました。

String[] command = new String[]{"cd",path};
Process child = Runtime.getRuntime().exec(command, null);

しかし、上記のコードでは次のエラーが発生します

Exception in thread "main" Java.io.IOException: Cannot run program "cd": Java.io.IOException: error=2, No such file or directory

誰でもそれを実装する方法を教えてもらえますか?

49
Antrromet

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

問題は、各プロセスに独自の現在の作業ディレクトリがあり、cdを個別のプロセスとして実装すると、変更されるthatが現在の作業ディレクトリ。

Javaプログラムでは、)できない現在の作業ディレクトリを変更できます。絶対ファイルパス。

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

注:現在の作業ディレクトリは、 システムプロパティから読み取ることができますuser.dirsetそのシステムプロパティに誘惑されるかもしれません。これを行うと、 非常に悪い不整合 につながることに注意してください。これは、 が書き込み可能でないmeantではないためです .

56
Joachim Sauer

以下のリンクを参照してください(これはその方法を説明しています):

http://alvinalexander.com/Java/edu/pj/pj010016

すなわち:

String[] cmd = { "/bin/sh", "-c", "cd /var; ls -l" };
Process p = Runtime.getRuntime().exec(cmd);
15
user518066

Java Runtimeの場合、このexecコマンドを調査しました。 "cd"するパスでファイルオブジェクトを作成し、execメソッドの3番目のパラメーターとして入力します。

public Process exec(String command,
                String[] envp,
                File dir)
         throws IOException

指定された環境と作業ディレクトリを使用して、指定された文字列コマンドを別のプロセスで実行します。

これは便利な方法です。 exec(command、envp、dir)という形式の呼び出しは、exec(cmdarray、envp、dir)の呼び出しとまったく同じように動作します。cmdarrayはcommand内のすべてのトークンの配列です。

より正確には、文字列をさらに変更することなく、new StringTokenizer(command)の呼び出しによって作成されたStringTokenizerを使用して、コマンド文字列がトークンに分割されます。トークナイザーによって生成されたトークンは、新しい文字列配列cmdarrayに同じ順序で配置されます。

Parameters:
    command - a specified system command.
    envp - array of strings, each element of which has environment variable settings in the format name=value, or null if the subprocess should inherit the environment of the current process.
    dir - the working directory of the subprocess, or null if the subprocess should inherit the working directory of the current process. 
Returns:
    A new Process object for managing the subprocess 
Throws:
    SecurityException - If a security manager exists and its checkExec method doesn't allow creation of the subprocess 
    IOException - If an I/O error occurs 
    NullPointerException - If command is null, or one of the elements of envp is null 
    IllegalArgumentException - If command is empty
12
optimus0127

このコマンドはうまく機能します

Runtime.getRuntime().exec(sh -c 'cd /path/to/dir && ProgToExecute)
7

使用してみてください:

Runtime.getRuntime.exec("cmd /c cd path"); 

これは機能しました

Runtime r = Runtime.getRuntime(); 
r.exec("cmd /c pdftk C:\\tmp\\trashhtml_to_pdf\\b.pdf C:\\tmp\\trashhtml_to_pdf\\a.pdf cat output C:\\tmp\\trashhtml_to_pdf\\d.pdf"); 

以下は機能しませんでした配列コマンドの使用中に機能しませんでした

String[] cmd = {"cmd /c pdftk C:\\tmp\\trashhtml_to_pdf\\b.pdf C:\\tmp\\trashhtml_to_pdf\\a.pdf cat output C:\\tmp\\trashhtml_to_pdf\\d.pdf"}; r.exec(cmd);

FYIは、上記のウィンドウがウィンドウ以外で機能するかどうかを確認するためにユーティリティを使用しています。removecmdおよび/ c

1
Dheeraj Sachan

プロセスビルダーのメソッドの1つを使用して、cmdが実行されると予想されるディレクトリを渡すことができます。以下の例をご覧ください。また、メソッドの待機を使用して、プロセスのタイムアウトに言及することができます。

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", cmd).directory(new File(path));

        Process p = builder.start();

        p.waitFor(timeoutSec, TimeUnit.SECONDS);

上記のコードでは、パスのファイルオブジェクト(cmdが実行されると予想される場所)をProcessBuilderのディレクトリメソッドに渡すことができます。

1
TechDog

Javaアプリケーションが同じディレクトリにあるshスクリプトを実行し、shスクリプトで "cd"を実行することでこれを解決しました。

ターゲットアプリケーションが適切に動作するように、特定のディレクトリに対して「cd」を実行する必要がありました。

0
Rami Del Toro