2017-06-07 124 views
0

したがって、私はを半日過ごしました。肯定的な結果は得られません。私はJava ProcessBuilderをいくつかの引数を使用していくつかの.exeファイルを実行するために使用していますが、ファイルパスにスペースが含まれていて、何とか正しく動作させることができません。私は私のコードは以下の通りですなど他のSOの記事の数をチェックし、エスケープ引用符で囲むコードのようなソリューションを実装し、コマンドと引数でそれを分割している:パスに空白があるとJava ProcessBuilderエラーが発生する

try { 
    ProcessBuilder pBuilder = new ProcessBuilder(
     // Main Command. 
     "C:\\namewith space\\database\\postgres_db\\bin\\pg_ctl.exe", 
     // Command Parameters. 
     "start", 
     "-D C:\\namewith space\\database\\database", 
     /*The quotes in the next argument are necessary, the -o stands for 'options' and everything between the quotes are the actual database parameters which to start the Database with.*/ 
     "-o \"-p 15000\"", 
     "-l C:\\namewith space\\database\\postgres_db\\bin\\postgres_log.txt"); 

    File log = new File("\"C:\\folder\\log.txt\""); 
    pBuilder.redirectErrorStream(true); 
    pBuilder.redirectOutput(Redirect.appendTo(log)); 
    Process p = pBuilder.start(); 
    } catch (IOException ex) { 
     System.out.println("Exception Occurred: " + ex); 
    } 

私がこれまで試してみました:

  • 上記のコード内の各パスを囲みません。問題が発生した場合に備えてエスケープされた引用符で囲みます。
  • Runtime.getRuntime().exec("full command with/without any/all escaped quotes");メソッドを使用していますが、SOで検索すると、誰かが、代わりにProcessBuilderを使用するべきだとわかっています。
  • "\"C:\\namewith space\\database\\postgres_db\\bin\\pg_ctl.exe\" start"
  • ファイルが所与のパスで100%に位置しているように、ProcessBuilerの最初のコマンド文字列に異なる方法で一緒に上記のコードの部分を追加、私は手でおよびファイルエクスプローラ内のパスを貼り付けることにより、これを確認10回以上。
  • コマンドを分割して、コマンドの作業ディレクトリをC:\ namewith space \に設定し、その部分のないargsを追加します。私は入れません(System.out.println("Exception Occurred: " + ex);経由)

エラーは次のとおりです。にjava.io.IOException:プログラムを実行することはできません"C:\ namewithスペ​​ース\データベース\のpostgres_dbの\ビン\のpg_ctl.exe":ファイル名、ディレクトリ名、またはボリュームラベルの構文が正しくありません。

余分な部品/コードが必要な場合はお知らせください。詳細を提供するために最善を尽くします。

+0

ディレクトリ名を修正したり、スペースを使わずにそのパスへのシンボリックリンクを作成したりするのは、実行可能なオプションですか?それらがあなたの唯一の選択肢であるなら、私は驚かないでしょう。そのエラーメッセージは、Javaからではなく、OSから来ているように見えます。 – dimo414

+0

dirNameの変更はオプションではありません。しかし、コマンドプロンプトに引用符を含めて完全に同じ完全な文をコピー/ペーストすると機能します。 .batファイルに入れても動作します。 syslinkの詳細について教えてください。 – OneBigOwnage

+0

[symlink](https://www.google.com/search?q=windows+symlink)は、ディスク上の別の場所へのポインタに過ぎないファイルです。 – dimo414

答えて

0

問題を解決してください。

まず、IOExceptionに示されている絶対パスをFileオブジェクトに読み込んでexists()メソッドを呼び出して、ファイルが実際に存在し、JVMがそのファイルにアクセスできることを確認します。

これで解決しない場合は、パスまたはアクセス権を修正してください。ファイルが実際に存在し、それにアクセスできる場合は、というパラメータなしでProcessBuilder を作成します。これはexeへの絶対パスです。

今はIOExceptionを取得しないでください。 次に、パラメータを1つずつ追加します。物事を壊すものが見つかった場合は、パラメータを修正してください(おそらく二重引用符がありません)。

+0

アクセスしようとしているファイルへのパスを含む新しいFileオブジェクトを作成しました。 myFile.exists()はtrueを返します。だから、プログラムはそれにアクセスしていることが良いことです。その後、EXACT同じパスを追加すると(パスの周りに余分なエスケープされた引用符がある場合とない場合)、IOExceptionが返されます。 [出力のスクリーンショット](http://i.imgur.com/Un4XNWF.png)。 – OneBigOwnage

+0

ファイルオブジェクトに対してgetAbsolutePath()メソッドを呼び出し、返された文字列をコマンドとして使用すると、それは機能しますか? – jllaneras

+0

これは実際に私がしたこととまったく同じです:/そのパスで新しい 'File'オブジェクトを作成し、ファイルが' myFile.exists() 'でコードにアクセスできるかどうかを確認し、' new ProcessBuilder(myFile) 'のようなpBuilderを作成しました。 getAbsolutPath()) 'を実行します。 – OneBigOwnage

関連する問題