gpt4 book ai didi

java - 将预转义的命令行参数传递给 ProcessBuilder

转载 作者:行者123 更新时间:2023-12-01 23:29:38 28 4
gpt4 key购买 nike

我今天在设置一组本地通信程序时遇到了这个问题。基本上,我的一个应用程序正在向另一个应用程序发送一些数据,并且该数据的一部分是一个包含要执行的命令的字符串(就像您从命令行执行的那样)。举例来说:

g++ foo.cc bar.cc -o foobar

是我的第一个应用程序发送的命令。接收命令(除其他外)的第二个应用程序需要在进行一些其他处理后执行该命令。

现在,起初我认为使用 ProcessBuilder 这会很简单:

String exampleCommand = "g++ foo.cc bar.cc -o foobar";
ProcessBuilder builder = new ProcessBuilder(exampleCommand);
builder.start().waitFor();

然而这就是问题发生的地方。

 CreateProcess error=2, The system cannot find the file specified

好吧,不用担心,我想我不能将整个事情转储到构建器中。命令的第一部分通常是一个简单的字符串,所以我想我可能可以在第一个 ' ' 周围进行分割来分隔程序名称和参数。

String exampleCommand = "g++ foo.cc bar.cc -o foobar";
String[] parts = exampleCommand.split(" ", 2);
ProcessBuilder builder = new ProcessBuilder(parts[0], parts[1]);
builder.start().waitFor();

这让我更接近了,现在可以正确找到 g++ 文件,但是在检查 g++stderr 之后我发现发生以下错误:

g++.exe: error: foo.cc bar.cc -o foobar: No such file or directory

此时我意识到 ProcessBuilder 类必须转义传递给它的所有参数,以准备命令行(因此它通常将参数作为单个参数的数组而不是只是一个预定义的参数字符串)。

我的问题是,“有没有办法将原始参数字符串传递给 ProcessBuilder 并说在那里,执行这个?”

因为该命令来自另一个应用程序并且绝不是静态的,所以我不能只是预先将参数分解为数组并将它们正确地传递给 ProcessBuilder 构造函数。这些参数并不是那么简单,只需将字符串拆分为 ' ' 即可正常工作;参数可能包含用双引号转义的空格。例如:

g++ "..\my documents\foo.cpp" bar.cpp -o foobar

可能是来自应用程序的命令,将该字符串拆分为 ' ' 并将其传递给 ProcessBuilder 将导致参数损坏。

如果没有正确的方法来做到这一点,有人可以向我指出一个独立的命令行参数解析器(Java 中的),它可以将命令行字符串转换为有效的 String[] 吗?

最佳答案

好吧,我现在感觉很愚蠢,但我通过简单地恢复到旧的 Runtime.getRuntime().exec(...) 就达到了我想要的结果。我会保留这个问题,以防有人像我一样愚蠢并发现它有用。

String exampleCommand = "g++ foo.cc bar.cc -o foobar";
Runtime sys = Runtime.getRuntime();
sys.exec(exampleCommand);

简单。

关于java - 将预转义的命令行参数传递给 ProcessBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19537276/

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