当前位置: 首页 > 面试题库 >

Java执行Windows为什么批处理文件没有处理?

萧繁
2023-03-14
问题内容

我有2个文件夹,每个文件夹包含数十个批处理文件(*.bat)。

批处理文件包含类似于以下内容的文本

del /f/q F:\MEDIA\IMAGE99\2010\270\z\4034\123.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\266\z\3025\456.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\267\z\3025\789.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\286\z\9025\101.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\272\z\6029\112.tif > nul
del /f/q F:\MEDIA\IMAGE99\2010\258\z\4034\134.tif > nul

要么

rmdir /q F:\MEDIA\IMAGE99\2010\270\z\4034
rmdir /q F:\MEDIA\IMAGE99\2010\266\z\3025
rmdir /q F:\MEDIA\IMAGE99\2010\267\z\3025
rmdir /q F:\MEDIA\IMAGE99\2010\286\z\9025
rmdir /q F:\MEDIA\IMAGE99\2010\272\z\6029
rmdir /q F:\MEDIA\IMAGE99\2010\258\z\4034

在Java中,我列出File了每个文件夹中的每个批处理,并循环浏览列表,执行每个批处理文件,如下所示:

public static boolean batch(File file) {

    boolean handled = false;
    Process process = null;
    try {

        process = Runtime.getRuntime().exec("cmd /c start " + file);
        handled = process.waitFor() == 0;

    } catch (Exception ex) {
        // handling removed for example purposes
    }

    return handled;
}

方法返回后,删除批处理文件。

问题是,批处理文件中的所有命令均未运行(我请求删除或删除的文件和文件夹均未运行),并且Java进程只是继续并删除了批处理文件本身。

批处理文件位于文件夹中 d:\working\spaced folder\purge\batch_files\

写下来之后,我怀疑我的问题是我正在将带有空格的文件路径传递给exec()方法。

我的怀疑正确吗?如果是这样,我该如何解决?如果没有,可能是什么问题?

我要研究一下Java:既然我已经考虑过,请执行/ cmd / c start-with-spaces \
program.exe

更新

根据下面的注释,我更改了代码,但现在输出挂起,waitFor()并且批处理文件未得到处理(我请求删除的文件仍然存在)。

码:

        String commandString = "cmd /c \"" + file +"\"";
        logger.info("COMMAND " + commandString);
        process = Runtime.getRuntime().exec(commandString);
        logger.info("WAITING FOR " + commandString);
        handled = process.waitFor() == 0;
        logger.info("HANDLED " + commandString + " = " + handled);

输出:

COMMAND : cmd /c "d:\working\spaced folder\purge\deleteBatch\F_140.bat"
WAITING FOR : cmd /c "d:\working\spaced folder\purge\deleteBatch\F_140.bat"

问题答案:

现在输出挂在 waitFor()

使用Java从外部启动外部进程时,Runtime.exec必须读取该进程产生的任何输出,否则该进程可能会阻塞(来源:JavaDocs for
java.lang.Process
)。

ProcessBuilder改用,并调用redirectErrorStream以合并标准输出和错误流,然后从中读取所有内容,process.getInputStream()直到达到EOF。只有这样才能安全打电话waitFor

ProcessBuilder还将帮助解决空格问题,因为您必须自己将命令行拆分为单个单词

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", file.getAbsolutePath());


 类似资料:
  • 问题内容: 我想从Java程序执行批处理文件。 我正在使用以下命令。 但是问题是我想提供一个相对路径而不是绝对路径,以便我可以在任何组件上部署该Java项目。 项目的目录结构如下: 我想从“解析器”目录中的“ Main.java”文件中运行“ util”目录中的“ Server.bat”文件。 问题答案: 当Java运行时,您可以将Runtime.exec()与相对路径一起使用,相对方式是相对于当

  • 问题内容: 我是hibernate的新手,我对hibernate批处理有疑问,我读了一些有关hibernate批处理的教程,他们说 Hibernate将所有持久化的对象缓存在会话级缓存中,最终您的应用程序将在第50,000行附近出现OutOfMemoryException崩溃。如果您将批处理与Hibernate一起使用,则可以解决此问题, 我的疑问是不是要在外部初始化会话,为什么我们不能将其初始化

  • 我正在windows机器上运行Jenkins.war进程的Jenkins。“java-jar Jenkins.war”。如果我关闭服务的命令提示符,詹金斯就会倒下。我希望Jenkins在命令提示符关闭的情况下仍然处于启动状态,甚至在机器重新启动之后,这个Jenkins也将被启动。我们如何在windows机器上做到这一点?

  • 主要内容:创建批处理文件,保存批处理文件,执行批处理文件,修改批处理文件在本章中,我们将学习如何创建,保存,执行和修改批处理文件。 创建批处理文件 批处理文件通常在记事本中创建。 因此,最简单的方法是打开记事本并输入脚本所需的命令。 对于这个练习,打开记事本并输入以下语句。 保存批处理文件 在创建批处理文件后,下一步是保存批处理文件。 批处理文件的扩展名为或。 命名批处理文件时需要注意的一些常规规则 - 在命名批处理文件时避免使用空格,有时会在从其他脚本中调用时产生问

  • 主要内容:编写和执行本章介绍与批处理脚本相关的环境。 编写和执行 通常,要创建批处理文件,可以使用记事本或Ediplus之类的文本编辑器。 这是创建批处理文件的最简单的工具。 接下来是批处理脚本的执行环境。 在Windows系统上,这是通过命令提示符或来完成。 所有批处理文件都在此环境中运行。 以下是启动的两种方法 - 方法1 - 转到并双击文件。如下图所示 - 方法2 - 通过运行命令 - 以下图片显示在Windo