Как запустить VB EXE-файл со стороны Java-сервера с параметрами - PullRequest
1 голос
/ 28 апреля 2019

Я пишу процесс Java-сервера, который дополнительно должен запускать файл vb.exe с параметрами только в Windows.

Я пытался использовать ProcessBuilder с функцией запуска и Process с функцией exec, но у меня нет ошибок, но ничего не происходит!

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 = 2 , система не может найти указанный файл", можете ли вы посоветовать?

  4. ProcessBuilder с cmd.exe:

    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? или что не так с моим кодом?

1 Ответ

0 голосов
/ 28 апреля 2019
  1. Изучите ошибку и выходной поток команды.Нужно перенаправить их и передавать их в отдельном потокеИли попробуйте эту форму

    File log = new File ("log");pb.redirectErrorStream (истина);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()

Я не думаю, что вам не нужно добавлять кавычки, просто установите их в массив с фактическими значениями.но если вы запускаете из .cmd, вам нужно будет квалифицировать параметры с пробелами, заключая в кавычки.Лучше всего, чтобы при тестировании не было пробелов в путях или параметрах.

См. github.com/tgkprog/nli/blob/master/RunCmd.java, если вы перенаправляете в журнал, не получайте поток снова втвой цикли не звоните через cmd.exe.в моем примере проигнорируйте фактическую команду, введите ur exe и params, я просто вызвал файл sh, как в ubuntu.Вы звоните со своими 4 параметрами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...