为什么当 Java 执行 Windows 批处理文件时,它们没有被处理?

2023-11-29

我有 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

or

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() method.

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

我要调查一下Java:执行 /cmd /c start path-with-spaces\program.exe现在我已经考虑过了。


UPDATE

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

Code:

        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);

Output:

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 从 Java 启动外部进程时Runtime.exec您必须读取该进程产生的任何输出,否则该进程可能会阻塞(来源:java.lang.Process 的 JavaDocs).

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

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

ProcessBuilder pb = new ProcessBuilder("cmd", "/c", file.getAbsolutePath());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么当 Java 执行 Windows 批处理文件时,它们没有被处理? 的相关文章

随机推荐

  • Java中如何处理关闭应用程序事件?

    拥有一个控制台应用程序 一个接受来自客户端的多个连接的服务器 是否可以在关闭的应用程序上拥有侦听器或事件 在这种情况下 我希望告诉所有连接的客户端在应用程序真正自行关闭之前轻轻断开连接 有什么解决办法吗 谢谢你 您想使用关闭挂钩 Runti
  • 在Win32中,如何改变STATIC文本的颜色?

    我的窗口上有一些黑色的静态文本 我想在运行时使用颜色选择器对话框更改它 我已经成功获得了颜色 现在我只需要更改文字即可 我读过WM CTLCOLORSTATICmessage 是要处理的消息 尽管这似乎仅适用于控件最初绘制到屏幕上时 可以W
  • 更新 Firebase 多位置并出现错误:路径是路径的祖先。迅速

    当我尝试使用以下命令在多个位置更新数据库时 updateChildValues 我收到下面列出的错误 我怎么解决这个问题 由于未捕获的异常 InvalidFirebaseData 而终止应用程序 原因 updateChildValues 对
  • 自定义单元格模板中带有按钮的 UI-Grid - 如何取消行选择事件?

    我正在使用 ui Grid v 3 0 1 我有一个特定列的自定义单元格模板 它在每行中显示一个按钮 我附加了一个 ng click 属性 它调用 appScope 来触发某些操作 一切都很顺利 但是 单击自定义模板按钮也会导致切换相关行的
  • 未找到基表或视图错误

    产品表 public function up Schema create product function Blueprint table table gt increments id table gt string name table
  • 使用 ionic 3 中的 Angularfire2 从 Firestore 获取集合文档的 ID

    这个问题在这里已经有答案了 我正在尝试获取集合的 id 以在离子页面中使用它 这是我的界面 export interface Item categoryOfPost string imageUrl string nameOfPost str
  • 如何使用 Python 3.x 读取和编辑 Google 电子表格?

    我知道我可以使用以下命令阅读和编辑 Google 电子表格gdata 但没有适用于 Python 3 的 gdata 版本 即使我想使用 Python 3 是否有一种 不是很复杂 的方法来编辑 Google 电子表格 我编写了一个替代方案G
  • 如何在 ffmpeg HLS 中启用 cookie

    有人知道如何在 ffmpeg 中启用 cookie 交互吗 我有一个 HLS 流 需要从服务器保存 cookie 但实际上这不会发生 你可以发送标头与 FFmpeg Linux ffmpeg i INPUT headers Cookie l
  • PyQt QLineEdit 与 QValidator

    我的项目中有一个 QLineEdit 我想在 qlineEdit 上使用验证 Create lineEdit itemValue QtWidgets QLineEdit Create objValidator QtGui QDoubleVa
  • 如何逐步安装和使用 joomla rest api

    请帮忙 我想在 joomla 2 5 中使用 REST api 我在 Github 和 techjoomla 上进行了很多搜索并花了很多天 我不明白如何安装 API 扩展或插件并使用它 即使我没有找到任何正确的文档来使用 API 以及从哪里
  • 使用 XSLT 减少 XML 输出

    如何使用 XSLT 仅从输入 xml 中选择一些 xml 标签到输出 XML 输入示例
  • 设置属性logging.pattern.console或logging.pattern.level时忽略覆盖模式

    使用 spring boot 1 3 2 我试图覆盖 application properties 文件中的 logback 模式 但无论我放入什么模式 总是会调用 spring boot jar xml 中的默认模式 我可以成功调整日志记
  • 如何在docker机器中挂载本地卷

    我正在尝试将 docker machine 与 docker compose 一起使用 文件 docker compose yml 的定义如下 web build command run web sh volumes app ports 8
  • 将标量和数组元素传递给需要数组的过程

    我有一些遗留的 Fortran 77 代码 我试图至少在不发出警告的情况下进行编译 不禁用警告 有些子例程调用会传递一个标量 而子例程需要一个数组 因为标量被用作大小为 1 的数组 所以这不会导致任何问题 但是使用英特尔编译器 如果我启用接
  • Python3、Selenium 和 Chrome 可移植

    也许有人可以帮助使用 Windows Python Selenium 以及使用 Chrome Webdriver 和 ChromePortable 我定义了一个新文件夹 c 我的项目 在此文件夹中 网络驱动程序位于 c myproject
  • 如何实现多维序列

    例如 这是每年的序列 这no增量与year no year 1 2016 2 2016 3 2016 1 2017 2 2017 4 2016 现在我已经为每年创建了序列但问题是Oracle不会在明年自动创建新的序列 另一个问题是如果我想使
  • sqlsrv_query 是否限制一个查询中可以执行的语句数量?

    我正在生成一个 SQLinsertPHP 中的语句for loop 生成的 SQL 字符串是大量单独的 SQL 语句 如下所示 INSERT INTO tbl VALUES 1 2 3 INSERT INTO tbl VALUES 4 5
  • NHibernate 如何将交叉引用表映射到包?

    我最近继承了一个包含 NHibernate 的工作项目 我对它非常陌生 必须对其中一个映射进行修改 我已阅读文档here我仍然不确定如何做到这一点 或者我的理解 术语是否正确 因此 鉴于以下表结构 我需要一个包来获取 ProjectName
  • 需要另一个帮助才能在屏幕上动态显示文本

    现在我使用 d3 js 遇到了第二个问题 我自己无法解决 我得到了一个动态数组 路径 当我点击时 其长度总是会改变 然后我在 svg 的起始位置 112 490 得到了一个 文本 变量 在你们的帮助下 我现在使用 for 循环根据控制台上的
  • 为什么当 Java 执行 Windows 批处理文件时,它们没有被处理?

    我有 2 个文件夹 每个文件夹包含数十个批处理文件 bat 包含类似于以下任一文本的批处理文件 del f q F MEDIA IMAGE99 2010 270 z 4034 123 tif gt nul del f q F MEDIA I