Java – 具有空格和双引号的ProcessBuilder命令参数失败

我正在使用ProcessBuilder来运行Windows可执行文件…我需要运行的确切命令是:

"C:\Program Files\CCBU\CCBU.exe" -d"C:\My Data\projects\ccbu\ciccb-report.xls" -tf"C:\Program Files\CCBU\loss-billing-filters.txt" 

如果我从命令提示符运行上述命令,它工作正常。

如果我然后发出命令和参数,如下面的StackOverflow post( ProcessBuilder将额外的引号添加到命令行 )中所示,它作为一个String []数组失败,因为目录path中的空格以某种方式将参数分解为CCBU.exe可执行文件:

 [log-snippet] 2015-08-31 10:39:08,937 [main] INFO rpd.primary - C:\Program Files\CCBU\CCBU.exe logging to the given report's directory Configuration file is: ./CCBUConfigFile.txt Running with the following settings: Report Filepath: C:\My Search Terms FilePath: C:\Program 2015-08-31 10:39:08,948 [main] INFO rpd.primary - STDERR:-------------------- 2015-08-31 10:39:08,961 [main] INFO rpd.primary - Warning: parameter Data\projects\ccbu\ciccb-report.xls not recognized. Ignoring Warning: parameter Files\CCBU\loss-billing-filters.txt not recognized. Ignoring Error: C:\Program not found or not readable [/log-snippet] 

如果我将数据文件和filter移动到不带空格的目录path,则工作正常:

 "C:\Program Files\CCBU\CCBU.exe" -d"C:\Users\n0002501\ccbu\ciccb-report.xls" -tf"C:\Users\n0002501\ccbu\loss-billing-filters.txt" 

问题是,这个过程的用户将把文件放在有空格的文件夹(目录)中。 所以不知何故,我必须得到它与空间的工作。 我想这是简单的,但我错过了什么?

我使用这篇文章中的类来处理STDOUT和STDERR的线程: http : //alvinalexander.com/java/java-exec-processbuilder-process-2

代码如下:

  // Split the Arguments : // In Eclipse and runtime, the arguments get broken : // The STDOUT from the command shows the Report Filepath // and Search Teams FilePath as broken at the 1st space... // // Report Filepath: C:\My // Search Terms FilePath: C:\Program // // SHOULD BE : // // Report Filepath: C:\My Data\projects\ccbu\ciccb-report.xls // Search Terms FilePath: C:\Program Files\CCBU\loss-billing-filters.txt // try { commands.add ( "\"C:\\Program Files\\CCBU\\CCBU.exe\"" ); commands.add ( "-d\"C:\\My Data\\projects\\ccbu\\ciccb-report.xls\"" ); commands.add ( "-tf\"C:\\Program Files\\CCBU\\loss-billing-filters.txt\"" ); commandExecutor = new SystemCommandExecutor(commands); commandExecutor.setLog ( getLog() ); // DEBUG : Build and printout the commands... // lstrCommand = ""; for ( int theIdx=0; theIdx<commands.size (); theIdx++ ) { if ( theIdx == 0 ) { lstrCommand = lstrCommand + commands.get ( theIdx ); } else { lstrCommand = lstrCommand + " " + commands.get ( theIdx ); } getLog().debug ( SHORT_NAME + " Building Command[] [" + commands.get ( theIdx ) + "]" ); } getLog().debug ( SHORT_NAME + " Running Command[] [" + lstrCommand + "]" ); result = commandExecutor.executeCommand(); // get the stdout and stderr from the command that was run stdout = commandExecutor.getStandardOutputFromCommand(); stderr = commandExecutor.getStandardErrorFromCommand(); // print the stdout and stderr getLog().info ( "SystemCommandExecutor - Status Code [" + result + "]" ); getLog().info ( "STDOUT:--------------------" ); getLog().info( stdout ); getLog().info ( "STDERR:--------------------" ); getLog().info( stderr ); } catch ( Exception ltheXcp ) { getLog().error ( SHORT_NAME + ".runTask () - Error/exception on commands [3-spaces] [" + lstrCommand + "]" ); } finally { commands.clear (); stdout = null; stderr = null; commandExecutor = null; } 

Jayan,工作的最终代码:

  try { commands.add ( "C:\\Program Files\\CCBU\\CCBU.exe" ); commands.add ( "-dC:\\My Data\\projects\\ccbu\\ciccb-report.xls" ); commands.add ( "-tfC:\\Program Files\\CCBU\\loss-billing-filters.txt" ); commandExecutor = new SystemCommandExecutor ( commands ); commandExecutor.setLog ( getLog() ); 

我所要做的就是取出所有的双引号,让ProcessBuilder自行处理目录path。

tia,adym

添加没有“双”引号的单个字符串..

  commands.add ( "C:\\Program Files\\CCBU\\CCBU.exe" ); commands.add ( "-d"); commands.add ("C:\\My Data\\projects\\ccbu\\ciccb-report.xls" ); commands.add ( "-tf"); commands.add("C:\\Program Files\\CCBU\\loss-billing-filters.txt" ); commandExecutor = new SystemCommandExecutor(commands); 

ProcessBuilder将负责处理参数。


拉起评论:

Jayan,你的想法让我思考:下面的工作:

  commands.add ( "-dC:\\My Data\\projects\\ccbu\\ciccb-report.xls" ); commands.add ( "-tfC:\\Program Files\\CCBU\\loss-billing-filters.txt" 

); – lincolnadym