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"

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

然后,如果我按照下面的帖子(ProcessBuilder在命令行中添加额外的引号)中的String

[]数组的形式发出命令和参数,则它将失败,因为目录路径中的空格以某种方式将参数打断到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]

如果我将数据文件和过滤器移动到没有空格的目录路径,则可以正常工作:

"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自己处理目录路径…

tia,阿迪姆

回答:

添加不带双引号的单个字符串。

                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将处理必要的args处理。


拉起评论:

Jayan,您的主意让我开始思考:以下方法有效:

 commands.add ( "-dC:\\My Data\\projects\\ccbu\\ciccb-report.xls" );

commands.add ( "-tfC:\\Program Files\\CCBU\\loss-billing-filters.txt"

); –林肯

以上是 Java-带空格和双引号的ProcessBuilder命令参数失败 的全部内容, 来源链接: utcz.com/qa/412858.html

回到顶部