У меня возникают проблемы с получением ProcessBuilder выполнения командной строки так же, как консоль cmd.exe.
- Командная строка:
show_parameters.bat jdk-1
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\""
- Пакетный файл
show_parameters.bat
(ниже) показывает токены, на которые cmd.exe разбивает командную строку. Testcase.java
(ниже) пытается выполнить ту же командную строку, что и №1, используя ProcessBuilder.Если вы запустите
show_parameters.bat jdk-1
, вы получите:
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\""
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);
}
}
}