【发布时间】:2013-09-21 10:42:54
【问题描述】:
我无法让ProcessBuilder 以与 cmd.exe 控制台相同的方式执行命令行。
- 命令行是:
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
Testcase.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);
}
}
}
【问题讨论】:
标签: java windows process cmd processbuilder