我需要使用ProcessBuilder构建以下命令:
"C:\Program Files\USBDeview\USBDeview.exe" /enable "My USB Device"
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下代码:
ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable \"My USB Device\"");
ProcessBuilder processBuilder = new ProcessBuilder(test);
processBuilder.start().waitFor();
Run Code Online (Sandbox Code Playgroud)
但是,这会将以下内容传递给系统(使用Sysinternals Process Monitor进行验证)
"C:\Program Files\USBDeview\USBDeview.exe" "/enable "My USB Device""
Run Code Online (Sandbox Code Playgroud)
请注意之前的引用/enable和之后的两个引号Device.我需要摆脱那些额外的引号,因为它们使调用失败.有谁知道如何做到这一点?
我继承了一些代码:
Process p = new ProcessBuilder("/bin/chmod", "777", path).start();
p.waitFor();
Run Code Online (Sandbox Code Playgroud)
基本上,存在一些古老且高度基于巫术的原因,用于将键/值对作为文件存储在磁盘上.我真的不想进入它.
但是,我留下了一堆IO异常:
Exception :Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Message: Cannot run program "/bin/chmod": java.io.IOException: error=24, Too many open files
Run Code Online (Sandbox Code Playgroud)
一堆我的意思是在1万亿的领域
我感觉waitFor调用是阻止这些进程等待进程完成它并退出,但我认为chmod在文件实际关闭之前返回结果.有谁知道这是否会导致这些例外?
我的另一个倾向是数千个文件的打开和关闭在java端没有快速发生,并且还有其他事情发生,可能是某种形式的文件缓冲区没有被清除掉正在调用fw.close().
我对java很新,这是一个让我难过的地狱怪异的东西.(很高兴应用程序仍以某种方式运行..吐出一个非常大的日志文件后)
任何人都可以想办法解决这个问题,清除缓冲区或增加文件打开限制,以便jvm可以跟上自己(假设这是问题)
我正在尝试使用Inkscape的命令行功能在Java中创建一个前端应用程序来处理批量SVG转换.我正在从https://sourceforge.net/projects/conversionsvg/获取并更新代码.原始开发人员通过Runtime.getRuntime().exec(String)处理Inkscape的方式.我遇到的问题是使用methodA和methodB之间存在一些不一致.我创建了一个简单的java测试项目来演示正在执行的不同操作.
CallerTest.java
package conversion;
import java.io.IOException;
public class CallerTest {
static String pathToInkscape = "\"C:\\Program Files\\Inkscape\\inkscape.exe\"";
public static void main(String[] args) {
ProcessBuilderCaller processBuilder = new ProcessBuilderCaller();
RuntimeExecCaller runtimeExec = new RuntimeExecCaller();
// methodA() uses one long command line string
try {
String oneLongString_ProcessBuilder = pathToInkscape + " -f \"C:\\test.svg\" -D -w 100 -h 100 -e \"C:\\ProcessBuilder-methodB.png\"";
String oneLongString_RuntimeExec = pathToInkscape + " -f \"C:\\test.svg\" -D -w 100 -h 100 -e \"C:\\RuntimeExec-methodA.png\"";
// processBuilder.methodA(oneLongString_ProcessBuilder);
runtimeExec.methodA(oneLongString_RuntimeExec);
} …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来重定向Process/ProcessBuilder的输出?我知道它在Java 7中可以这样工作:
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectOutput();
Process process = builder.start();
Run Code Online (Sandbox Code Playgroud)
但我对Java 5/6也需要相同的...任何帮助高度赞赏.
我试图通过使用以下代码在Windows中启动CMD应用程序,但它不能按预期工作.来自不同网站的几个示例显示,作为ProcessBuilder构造中的参数的"cmd"应该有效.
我需要做些什么才能让我的Java应用程序在Windows中打开CMD应用程序?
public class JavaTest
{
public static void main(String[] args)
{
ProcessBuilder pb = new ProcessBuilder("cmd");
try
{
pb.start();
System.out.println("cmd started");
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用不存在的应用程序时,它实际上会输出错误,这意味着它实际上运行"CMD".但CMD应用程序没有按预期弹出?
我正在尝试为ProcessBuilder对象添加一个环境变量,但是当我在ProcessBuilder中调用该新变量时,我收到一个错误.这就是我构建流程的方式
public class OTU
{
public static void main(String[] args) throws Exception
{
ProcessBuilder pb = new ProcessBuilder();
Map<String, String> env = pb.environment();
//set environment variable u
env.put("u", "util/");
pb.command("echo $u");
Process p = pb.start();
String output = loadStream(p.getInputStream());
String error = loadStream(p.getErrorStream());
int rc = p.waitFor();
System.out.println("Process ended with rc=" + rc);
System.out.println("\nStandard Output:\n");
System.out.println(output);
System.out.println("\nStandard Error:\n");
System.out.println(error);
}
private static String loadStream(InputStream s) throws Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(s));
StringBuilder sb = new StringBuilder();
String …Run Code Online (Sandbox Code Playgroud) 我知道如果你ProcessBuilder.start在Java中使用它来启动一个外部进程,你必须使用它的stdout/stderr(例如见这里).否则外部进程会在启动时挂起.
我的问题是为什么它以这种方式工作.我的猜测是JVM将执行过程的stdout/stderr重定向到管道,如果管道没有空间,则对管道的写入阻塞.是否有意义?
现在我想知道为什么 Java会这样做.这个设计背后的理由是什么?
我正在使用ProcessBuilder类和Process类从java执行.exe文件.解释我在做什么:
builder = new ProcessBuilder(commands);
builder.redirectErrorStream(true);
Process process = builder.start();
process.waitFor();
Run Code Online (Sandbox Code Playgroud)
我只是想知道,"waitFor()"等待多久了?是等待我的.exe执行,还是等到执行结束?
我的.exe是一个已编译的AutoIt脚本.这意味着,可能会有像鼠标移动这样的交互,这需要一些时间.因此,我需要知道在调用.exe之后我的Java代码执行是否继续,或者它是否真的在等待它.
我想要实现的是两个脚本的旋转执行,但我担心,我的Java代码正在执行第二个脚本,而第一个脚本仍在运行.有没有人解决这个问题?我很高兴有任何想法.
我一直在尝试Process和ProcessBuilder并配备了这种SSCCE.
import java.io.IOException;
public class TestProcess {
public static void main(String[] args) {
Process process = null;
ProcessBuilder pb = new ProcessBuilder("notepad.exe");
try {
process = pb.start();
} catch (IOException e) {e.printStackTrace();}
//have some time to close notepad
try {
Thread.sleep(10*1000);
} catch (InterruptedException ignored) {}
try {
System.out.println(process.exitValue());
} catch (IllegalThreadStateException e) {
System.out.println(e);
}
if (process != null)
process.destroy();
/*try {
Thread.sleep(0, 1);
} catch (InterruptedException ignored) {}*/
System.out.println(process.exitValue());
}
}
Run Code Online (Sandbox Code Playgroud)
destroy()在尝试停止已经终止的进程时,调用没有显示任何问题. …我有以下Windows批处理文件(run.bat):
@echo off
echo hello batch file to sysout
Run Code Online (Sandbox Code Playgroud)
以下java代码,它运行批处理文件并将输出重定向到文件:
public static void main(String[] args) throws IOException {
System.out.println("Current java version is: " + System.getProperty("java.version"));
ProcessBuilder pb =
new ProcessBuilder("cmd.exe", "/c",
"run.bat"
,">>", "stdout.txt","2>>", "stderr.txt"
);
System.out.println("Command is: " + pb.command());
Process proc = pb.start();
InputStream in = proc.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
int exitValue = proc.exitValue();
System.out.println("Exit value: " + exitValue);
}
Run Code Online (Sandbox Code Playgroud)
在JDK上,包括JDK6u43,我得到以下输出:
Current …Run Code Online (Sandbox Code Playgroud)