2014-11-25 1 views
1

Я пытаюсь запустить командный файл из программы Java. Например: у меня есть пакет «abc.bat» в папке «Program Files».Как получить доступ к пути к файлу с пробелами из командной строки в Java

Я хочу выполнить эту партию из моей программы Java. Я использую класс CommandLine, Commons-exec jar.

CommandLine cmdLine = CommandLine.parse("cmd"); 
cmdLine.addArgument("/c start \"\" \"C:\\Program Files\\abc.bat\""); 

DefaultExecutor exec = new DefaultExecutor(); 
Process p = Runtime.getRuntime().exec(cmdLine.toString()); 
exec.execute(cmdLine); 

Приведенный выше код выдает ошибку о том, «Windows не могу найти файл. Убедитесь, что вы ввели имя правильно, и повторите попытку». И это из-за пробелов на пути.

Итак, я попробовал ответ, указанный здесь @ brso05, и это работает. Но я хочу, чтобы он был в будущем классе. Пожалуйста, найдите мой код ниже и помогите мне исправить это.

final CommandLine cmdLine = CommandLine.parse("cmd.exe"); 
cmdLine.addArgument("/c"); 
cmdLine.addArgument("start"); 
cmdLine.addArgument("\""+ batchFileExecute.getParent().toString() + "\""); 

ExecutorService es = Executors.newFixedThreadPool(1); 
Future<?> future = es.submit(new Runnable() { 
     public void run() { 
       DefaultExecutor exec = new DefaultExecutor(); 
         try { 
          Process p = Runtime.getRuntime().exec(cmdLine.toString()); 
          exec.execute(cmdLine); 
          System.out.println(p.waitFor()); 
          } 
         catch (IOException e) 
          { 
           e.printStackTrace(); 
          } 
         catch (InterruptedException e) 
          { 
           e.printStackTrace(); 
          } 
         } 
         }); 
          String thread_status = null; 
          try 
          { 
           thread_status = future.get().toString(); 
           System.out.println(thread_status+" completed the execution"); 
          } 
          catch (NullPointerException e) 
          { 
          System.out.println("The execution of the received project is  complete.");     
// In here I want to do some processing again. 
} 

Код, упомянутый мной, работает, но он не работает, если в моем командном файле есть пробелы в пути. Можете ли вы помочь мне исправить это?

Исследуйте фрагмент, который вы дали, но затем я не могу положить его в Будущее. Он не работает должным образом.

Заранее благодарен!

+1

Должен работать, вы уверены, что файл есть? – brso05

+0

да .. Я пробовал .. и его не работает .. Я пытаюсь запустить пакет через командную строку с Java. – user1395264

+0

Попробуйте мой ответ. Думаю, это сработает для вас ... – brso05

ответ

0

Вы пробовали с одинарными кавычками? Согласно this, он должен работать.

+0

одинарные кавычки ??? в ссылке, которую вы упомянули .. используются только двойные кавычки. – user1395264

+0

См. эту часть в приведенной ссылке: «Из-за пространства в имени файла мы должны указать имя файла либо с одинарными, либо с двойными кавычками» – jmm

1

Это альтернативный способ:

 Runtime rt = Runtime.getRuntime(); 
    rt.exec("cmd.exe /c start \"\" \"C:\\Program Files\\abc.bat\""); 
+0

просто дает мне путь на моей консоли «D: \ Execution \ Java>», который, по моему мнению, является стандартным путем моей подсказки cmd. – user1395264

+0

@ user1395264 Эй, я только что отредактировал его, теперь он должен работать! – brso05

+0

, который отлично работает для меня .. но у меня проблема .. Я запускаю это в цикле, и каждая партия имеет определенное действие .. после того, как оно завершает действие, я хочу, чтобы следующая партия была выполнена ... Для этого, Мне нужно использовать класс CommandLine .. но это решение не работает для CommandLine ... Можете ли вы помочь? Обновленный мой отрезанный в моем вопросе .. – user1395264

0

Я имел те же имена файлов с вопросом пространства при использовании ImageMagick. Вот код, чтобы решить вопрос:

String imageOutput = null; 
ByteArrayOutputStream identifyStdout = new ByteArrayOutputStream(); 
ByteArrayOutputStream identifyStderr = new ByteArrayOutputStream(); 

try 
{ 
    DefaultExecutor identifyExecutor = new DefaultExecutor(); 
    // End the process if it exceeds 60 seconds 
    ExecuteWatchdog identifyWatchdog = new ExecuteWatchdog(60000); 
    identifyExecutor.setWatchdog(identifyWatchdog); 


    PumpStreamHandler identifyPsh = new PumpStreamHandler(identifyStdout, identifyStderr); 
    identifyExecutor.setStreamHandler(identifyPsh); 
    identifyExecutor.setExitValue(0); //0 is success 

    CommandLine identifyCommandline = new CommandLine("identify"); 
    identifyCommandline.addArgument(destFile.getAbsolutePath(), false); 

    DefaultExecuteResultHandler identifyResultHandler = new DefaultExecuteResultHandler(); 

    identifyExecutor.execute(identifyCommandline, identifyResultHandler); 
    identifyResultHandler.waitFor(); 

    if (identifyResultHandler.getExitValue() != 0) 
    { 
     String output = identifyStdout.toString(); 
     _logger.debug("Standard Out = " + output); 
     _logger.debug("Standard Err = " + identifyStderr.toString()); 

     String msg = "ImageMagick overlay encountered an error. ImageMagick returned a value of " + identifyResultHandler.getExitValue(); 
     throw new Exception(msg); 
    } 
    else 
    { 
     imageOutput = identifyStdout.toString(); 
     _logger.debug("Standard Out = " + imageOutput); 
     identifyStdout.close(); 
     identifyStderr.close(); 
    } 
} 
catch(Exception e) 
{ 
    _logger.debug("Error: " + e.getLocalizedMessage(), e); 
} 
finally 
{ 
    identifyStdout.close(); 
    identifyStderr.close(); 
} 

Важную роль здесь:

identifyCommandline.addArgument(destFile.getAbsolutePath(), false); 

Эта линия позволяет путь_к_файлу с пробелами, чтобы правильно обработать.