0

我想通过 SystemCommandTasklet 运行系统命令。使用下面的示例代码对此进行了尝试,但出现错误。

我认为这是因为命令参数,但我无法修复它。

如果有帮助,我会很高兴。

参考例子;

错误详情;

“CreateProcess error=2,系统找不到指定的文件”

代码示例;

 @Bean
@StepScope
public SystemCommandTasklet fileSplitterSystemCommandTasklet(@Value("#{jobParameters['file']}") File file) throws Exception {

    final String fileSeparator = System.getProperty("file.separator");
    String outputDirectory = file.getPath().substring(0, file.getPath().lastIndexOf(fileSeparator)) + fileSeparator + "out" + fileSeparator;

    File output = new File(outputDirectory);

    if (!output.exists()) {
        output.mkdir();
    }

    final String command = String.format("split -a 5 -l 10000 %s %s",file.getName(),outputDirectory);

    var fileSplitterTasklet = new SystemCommandTasklet();
    fileSplitterTasklet.setCommand(command);
    fileSplitterTasklet.setTimeout(60000L);
    fileSplitterTasklet.setWorkingDirectory(outputDirectory);
    fileSplitterTasklet.setTaskExecutor(new SimpleAsyncTaskExecutor());
    fileSplitterTasklet.setSystemProcessExitCodeMapper(touchCodeMapper());
    fileSplitterTasklet.afterPropertiesSet();
    fileSplitterTasklet.setInterruptOnCancel(true);
    fileSplitterTasklet.setEnvironmentParams(new String[]{
            "JAVA_HOME=/java",
            "BATCH_HOME=/Users/batch"});
    return fileSplitterTasklet;
}
4

1 回答 1

0

您需要使用file.getAbsolutePath()而不是file.getPath().

此外,您file.getName()在命令中使用:

final String command = String.format("split -a 5 -l 10000 %s %s",file.getName(),outputDirectory);

您应该传递文件的绝对路径或确保正确设置工作目录,以便split在与文件相同的目录中执行命令。

于 2020-07-06T10:10:05.653 回答