java - 如何让 ProcessBuilder 处理嵌套引号?

标签 java windows process cmd processbuilder

我在获取 ProcessBuilder 时遇到问题以与 cmd.exe 控制台相同的方式执行命令行。

  1. 命令行是: show_parameters.bat jdk-1_5_0_22-windows-i586-p.exe/s/v"/qn INSTALLDIR=\"C:\Program Files (x86)\gili\""
  2. 批处理文件 show_parameters.bat(如下)显示 cmd.exe 将命令行分解为的标记。
  3. Testcase.java(如下)尝试使用 ProcessBuilder 执行与 #1 相同的命令行。
  4. 如果运行 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\""
    
  5. 如果运行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);
        }
    }
}

最佳答案

尝试这样:

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 processBuilder = new ProcessBuilder("cmd.exe", "/c", "show_parameters.bat jdk-1_5_0_22-windows-i586-p.exe /s /v\"/qn INSTALLDIR='" + base + "'\"");

“/c”仅需要一个参数 - 将在 CMD 中执行的命令

关于java - 如何让 ProcessBuilder 处理嵌套引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18842307/

相关文章:

c++ - 互斥和进程同步; C++

java - 在 Java 中消除命名实体的歧义

java - 抽象类中的 getClass() 给出了不明确的方法调用

Windows 服务输出

python - 如何在批处理脚本中嵌入 python 代码

c - 调用函数 popen 中断进程

java - 从项目 onclick 更新回收 View 行

java - 将图像绘制为多边形

c++ - EnumDisplayMonitors 和 EnumDisplaySettings 不同意

java - 为什么 Process.waitfor 不返回?