cmd.exe コンソールと同じ方法でProcessBuilderにコマンドラインを実行させるのに問題があります。
- コマンドラインは次のとおりです。
show_parameters.bat jdk-1_5_0_22-windows-i586-p.exe /s /v"/qn INSTALLDIR=\"C:\Program Files (x86)\gili\""
- バッチ ファイル
show_parameters.bat
(以下) は、cmd.exe がコマンド ラインを分割するトークンを示しています。 Testcase.java
(下) ProcessBuilder を使用して #1 と同じコマンドラインを実行しようとします。実行
show_parameters.bat jdk-1_5_0_22-windows-i586-p.exe /s /v"/qn INSTALLDIR=\"C:\Program Files (x86)\gili\""
すると、次のようになります。Console tokens: jdk-1_5_0_22-windows-i586-p.exe /s /v"/qn INSTALLDIR=\"C:\Program Files (x86)\gili\""
実行
java Testcase
すると、次のようになります。Java tokens: [cmd.exe, /c, show_parameters.bat, jdk-1_5_0_22-windows-i586-p.exe, /s, /v"/qn INSTALLDIR=\"C:\Program Files (x86)\gili\""] Console tokens: jdk-1_5_0_22-windows-i586-p.exe /s "/v"/qn INSTALLDIR \"C:\Program Files (x86)\gili\" ""
ProcessBuilder に #1 と同じトークン化を生成させることは可能ですか? それともJavaのバグですか?
show_parameters.bat
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
echo.
echo Console tokens:
echo.
:again
if [%1] == [] goto end
echo %1
shift
goto again
:end
テストケース.java
import java.io.*;
public class Testcase
{
public static void main(String[] args) throws IOException, InterruptedException
{
String base = "C:\\Program Files (x86)\\gili";
ProcessBuilder processBuilder = new ProcessBuilder("cmd.exe", "/c", "show_parameters.bat", "jdk-1_5_0_22-windows-i586-p.exe", "/s",
"/v\"/qn INSTALLDIR=\\\"" + base + "\\\"\"");
processBuilder.redirectErrorStream(true);
System.out.println("Java tokens: " + processBuilder.command());
Process process = processBuilder.start();
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
while (true)
{
String line = in.readLine();
if (line == null)
break;
System.out.println(line);
}
}
}