【问题标题】:Using SystemCommandTasklet to split file使用 SystemCommandTasklet 拆分文件
【发布时间】:2026-02-14 06:45:01
【问题描述】:

我想通过 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;
}

【问题讨论】:

    标签: spring-boot spring-batch flat-file spring-batch-tasklet


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 首先非常感谢您的帮助#Ma @Mahmoud Ben Hassine。我试过了,但没用。file.getAbsolutePath() 和 file.getPath() 返回相同的值。
    • 您的问题The system cannot find the file specified 表示找不到文件。确保工作目录的文件路径正确:fileSplitterTasklet.setWorkingDirectory(outputDirectory);
    • 目录和文件正确且存在。如果我尝试不存在文件和目录,错误消息是“目录路径必须存在”。
    • 你在命令中使用file.getName(),你需要确保最终的split命令是正确的(命令在正确的目录下执行,文件路径是正确的等等)。尝试调试查看最终命令是否正确。
    • 分割命令是正确的。我已经通过命令执行器检查了命令,并且它执行成功。你有任何成功执行的代码示例吗?