我有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机器上做到这一点?
主要内容:创建批处理文件,保存批处理文件,执行批处理文件,修改批处理文件在本章中,我们将学习如何创建,保存,执行和修改批处理文件。 创建批处理文件 批处理文件通常在记事本中创建。 因此,最简单的方法是打开记事本并输入脚本所需的命令。 对于这个练习,打开记事本并输入以下语句。 保存批处理文件 在创建批处理文件后,下一步是保存批处理文件。 批处理文件的扩展名为或。 命名批处理文件时需要注意的一些常规规则 - 在命名批处理文件时避免使用空格,有时会在从其他脚本中调用时产生问
问题内容: 我有一个简单的批处理文件。我想 从Jenkins调用/运行/执行该文件 。 Jenkins中是否有相同的插件? 如何从Jenkins执行批处理文件?如果有相同的任何教程或文档。 问题答案: 在Linux上,转到jenkins作业,转到配置,添加构建步骤“ execute shell”,然后键入脚本的名称。请确保您的文件是可执行文件(chmod 777 yourscript.sh),并且