gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:17:40 25 4
gpt4 key购买 nike

我在获取 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 中的错误?


显示参数.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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com