【问题标题】:how to run vb exe file from java server side with parameters如何使用参数从java服务器端运行vb exe文件
【发布时间】:2019-04-28 07:47:38
【问题描述】:

我正在编写一个 java 服务器进程,它还应该只在 windows 中运行带有参数的 vb.exe 文件。

我尝试使用带有 start 功能的 ProcessBuilder 和带有 exec 功能的 Process 但我没有错误但没有任何反应!

以cmd为例:

"C:\AL500\BIAFLABEL\AddToQueue.exe" "C:\AL500\BiafLabel\Templates\2.xml" -printer \\mickaelbpc\System-N

代码中的命令行定义:

String fullcmd = "\"C:\\AL500\\BIAFLABEL\\AddToQueue.exe\" \"C:\\AL500\\BiafLabel\\Templates\\2.xml\" -printer \\\\mickaelbpc\\System-N";
String fullcmd1 = "C:\\AL500\\BIAFLABEL\\AddToQueue.exe C:\\AL500\\BiafLabel\\Templates\\2.xml -printer \\\\mickaelbpc\\System-N";
String cmd1 = "C:\\AL500\\BIAFLABEL\\AddToQueue.exe";
String cmd2 = "C:\\AL500\\BiafLabel\\Templates\\2.xml";
String cmd3 = "-printer";
String cmd4 = "\\\\mickaelbpc\\System-N";   
String[] command = new String[]{cmd1, cmd2, cmd3,cmd4};
  1. 进程+数组:

    File dir = new File("C:/workspace");
    Process process = Runtime.getRuntime().exec(command, null, dir);
    process.waitFor();
    InputStream stdout = process.getInputStream();
    InputStream stderr = process.getErrorStream();
    String strData;
    StringBuffer sb = new StringBuffer("");
    
    BufferedReader brData = new BufferedReader(new 
    InputStreamReader(stdout));
    while ((strData = brData.readLine()) != null)
    {
         sb = sb.append(strData).append("\r\n");
    }
    brData.close(); 
    
  2. ProcessBuilder + 带“:”的字符串命令

    ProcessBuilder pb=new ProcessBuilder(fullcmd);
    pb.redirectErrorStream(true);
    Process process1=pb.start();
    BufferedReader inStreamReader = new BufferedReader(
        new InputStreamReader(process1.getInputStream())); 
    String line;
    while (true) {
        line = inStreamReader.readLine();
        if (line == null) { break; }
        System.out.println(line);
    
  3. ProcessBuilder + 不带“:”的字符串命令

     File log = new File("log"); 
     ProcessBuilder pb=new ProcessBuilder(/*command*/fullcmd1);
     pb.redirectErrorStream(true);
     pb.redirectOutput(Redirect.appendTo(log));
     Process process1=pb.start();
     BufferedReader inStreamReader = new BufferedReader(
                new InputStreamReader(process1.getInputStream())); 
     String line;
     while (true) {
          line = inStreamReader.readLine();
          if (line == null) { break; }
               System.out.println(line);
          }
    

    更改后我收到此错误:“java.io.IOException:无法运行程序“C:\AL500\BIAFLABEL\AddToQueue.exe C:\ AL500\BiafLabel\Templates\2.xml -printer \mickaelbpc\System-N": CreateProcess error=2, 系统找不到指定的文件" 能否请教?

  4. 带有 cmd.exe 的 ProcessBuilder:

    ProcessBuilder pb=new ProcessBuilder("cmd.exe","/c",fullcmd);
    pb.redirectErrorStream(true);
    Process process1=pb.start();
    BufferedReader inStreamReader = new BufferedReader(
        new InputStreamReader(process1.getInputStream())); 
    String line;
    while (true) {
            line = inStreamReader.readLine();
            if (line == null) { break; }
            System.out.println(line);
     }
    

我做了所有的选项等等...如果有必要我会添加更多的例子

vb exe 应该打印一个文件。知道如何从java进程运行它吗?或者我的代码有什么问题?

【问题讨论】:

  • 据我了解流程构建器,您不应该在命令字符串中连接参数,而是将每个参数作为独立参数传递。你试过ProcessBuilder pb=new ProcessBuilder(command);
  • 这个可执行文件应该运行在服务器还是客户端?
  • Alexandre Cartapanis:我试过了,但结果相同 - 没有错误,也没有任何反应。
  • Andrew Thompson:我如何检查它?我在命令提示符下运行相同的命令行并且它可以工作。问题只是当我在 java 服务器上这样做时

标签: java maven server


【解决方案1】:
  1. 研究命令的错误和输出流。需要重定向它们并将它们流式传输到单独的线程中。或者试试这个

    文件日志 = new File("log"); pb.redirectErrorStream(true); pb.redirectOutput(Redirect.appendTo(log));

  2. 完整路径是否正确?您可以将逗号分隔的行空间打印到一个名为 run.cmd 的文件中,然后手动运行它并查看提示符会发生什么吗?

  3. 您从哪个目录启动进程可能必须不同于运行您的 java 程序的目录?流程生成器有一个https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#directory()

要知道您的 java 程序正在使用哪个目录,请执行以下操作:

File f = new File("./");
try{
    System.out.println("Start dir is :" + f.getCanonicalFile());
}catch...

https://docs.oracle.com/javase/7/docs/api/java/io/File.html#getCanonicalFile()

  1. 我认为您不需要添加引号,只需将它们设置在具有实际值的数组中即可。但如果从 .cmd 运行,您将需要通过加引号来用空格限定参数。测试时最好在路径或参数中没有空格。

如果您重定向到日志,请参阅 github.com/tgkprog/nli/blob/master/RunCmd.java,不要在循环中再次获取流。并且不要通过 cmd.exe 调用。在我的示例中,忽略实际的命令,输入你的 exe 和参数,我只是在 ubuntu 上调用了一个 sh 文件。你用你的 4 个参数调用

【讨论】:

  • 关于你的回答: 1. 日志文件是空的,但是什么也没有发生
  • 2.我将命令行 (C:\AL500\BIAFLABEL\AddToQueue.exe C:\AL500\BiafLabel\Templates\2.xml -printer \\mickaelbpc\System-N) 放在 run.cmd 文件中,它可以手动运行,但我必须空间
  • 3. pb.directory() 为 null - 这意味着使用当前 Java 进程的工作目录。当前目录是:C:\eclipse,我可以从这个文件夹手动运行命令行。你有什么想法或其他解决方案吗?
  • 你能展示你现在的完整代码吗?我唯一能想到的是流(输入、输出和错误流)的处理如果没有正确处理,进程可能会挂起
  • process.waitFor();在您完全设置流程后将其移至如果可能的话,将您的类放在 github 中,以便其可运行且易于查看完整文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多