标签: processbuilder

ProcessBuilder为命令行添加了额外的引号

我需要使用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.我需要摆脱那些额外的引号,因为它们使调用失败.有谁知道如何做到这一点?

java windows process processbuilder

10
推荐指数
3
解决办法
9495
查看次数

Process Builder waitFor()问题和打开文件限制

我继承了一些代码:

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可以跟上自己(假设这是问题)

java processbuilder java-io

9
推荐指数
2
解决办法
3万
查看次数

ProcessBuilder与Runtime.exec()

我正在尝试使用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)

java external-process runtime.exec inkscape processbuilder

9
推荐指数
1
解决办法
2万
查看次数

在Java 5/6中重定向ProcessBuilder的输出?

我正在寻找一种方法来重定向Process/ProcessBuilder的输出?我知道它在Java 7中可以这样工作:

ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectOutput();
Process process = builder.start();
Run Code Online (Sandbox Code Playgroud)

但我对Java 5/6也需要相同的...任何帮助高度赞赏.

java redirect process processbuilder

9
推荐指数
1
解决办法
6867
查看次数

使用ProcessBuilder启动CMD

我试图通过使用以下代码在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应用程序没有按预期弹出?

java cmd runtime.exec processbuilder

9
推荐指数
2
解决办法
3万
查看次数

java中的ProcessBuilder环境变量

我正在尝试为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)

java unix processbuilder

9
推荐指数
2
解决办法
2万
查看次数

如果父进程没有在Java中使用stdout/stderr,为什么进程会挂起?

我知道如果你ProcessBuilder.start在Java中使用它来启动一个外部进程,你必须使用它的stdout/stderr(例如见这里).否则外部进程会在启动时挂起.

我的问题是为什么它以这种方式工作.我的猜测是JVM将执行过程的stdout/stderr重定向到管道,如果管道没有空间,则对管道的写入阻塞.是否有意义?

现在我想知道为什么 Java会这样做.这个设计背后的理由是什么?

java process processbuilder

9
推荐指数
2
解决办法
5007
查看次数

ProcessBuilder和Process.waitFor(),等待多长时间?

我正在使用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代码正在执行第二个脚本,而第一个脚本仍在运行.有没有人解决这个问题?我很高兴有任何想法.

java console process wait processbuilder

9
推荐指数
3
解决办法
2万
查看次数

Process.exitValue()和Process.destroy()功能

我一直在尝试ProcessProcessBuilder并配备了这种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)
  1. 如果我在10秒超时之前运行此代码并关闭记事本.destroy()在尝试停止已经终止的进程时,调用没有显示任何问题. …

java windows process processbuilder

8
推荐指数
1
解决办法
2万
查看次数

如何将进程输出管道传输到Windows和JDK 6u45上的文件

我有以下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)

java jdk1.6 processbuilder

8
推荐指数
2
解决办法
1万
查看次数