Java 问题:连续两次启动cmd.exe
为了避免重复操作,我正在尝试自动化一些古代构建的流程。要求在一批中启动流程,在另一批中停止流程(顺便说一句,这是无法更改的) 因此,我制作了一个命令行工具来实现这一点(以及许多其他重复的东西),并对启动“startbatch”的命令和启动“stopbatch”的命令进行了建模。这两个命令分别运行良好(正如我分别测试它们时所做的),但当我想要一个接一个地执行它们时(当然是按照正确的顺序执行),似乎出现了问题。我在new cmd.exe窗口中遇到以下错误: 进程无法访问该文件,因为其他进程正在使用该文件 我用于启动批处理的代码如下所示:Java 问题:连续两次启动cmd.exe,java,batch-file,process,runtime.exec,Java,Batch File,Process,Runtime.exec,为了避免重复操作,我正在尝试自动化一些古代构建的流程。要求在一批中启动流程,在另一批中停止流程(顺便说一句,这是无法更改的) 因此,我制作了一个命令行工具来实现这一点(以及许多其他重复的东西),并对启动“startbatch”的命令和启动“stopbatch”的命令进行了建模。这两个命令分别运行良好(正如我分别测试它们时所做的),但当我想要一个接一个地执行它们时(当然是按照正确的顺序执行),似乎出现了问题。我在new cmd.exe窗口中遇到以下错误: 进程无法访问该文件,因为其他进程正在使用该
public void startBatchInDev(String company){
String startBatchFolder = locations.getLocationFor("startbatch");
try{
Runtime runtime = Runtime.getRuntime();
runtime.exec("cmd.exe /C cd \"" + startBatchFolder + "\" & start cmd.exe /k \"" + BATCHSTART + company.toLowerCase()+ "-dev" + BATCH_SUFFIX + "\"");
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
public void stopBatchInDev(String company){
String startBatchFolder = locations.getLocationFor("startbatch");
try{
Runtime runtime = Runtime.getRuntime();
runtime.exec("cmd.exe /C cd \"" + startBatchFolder + "\" & start cmd.exe /k \"" + BATCHSTOP + company.toLowerCase()+ "-dev" + BATCH_SUFFIX + "\"");
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
批处理文件的名称是串联的,但一旦应用程序运行,它们就可以了
错误信息非常清楚,一些文件被锁定,因此我无法访问它。一些谷歌搜索证实了我的怀疑,但我似乎找不到解决办法。谷歌的热门话题都是关于文件的明显用途,比如一个明显的共享资源。但就我而言,我并不是在处理同一批处理文件。停止和开始批处理是两个不同的文件。所以我实际上开始认为它可能是被windows锁定的cmd.exe文件
所以这个问题实际上是两个问题:
-所述问题的确切原因是什么?
-如何以编程方式修复此问题(如果可能)
提前谢谢 所以,基本上,bat并没有那么好:-( 我能够从java重新编写此脚本,但我还发现此脚本:
@echo off
echo STOP
echo STOP >> E:\tmp\java\logfile.txt
C:\cygwin\bin\sleep.exe 1
echo STOP1 >> E:\tmp\java\logfile.txt
C:\cygwin\bin\sleep.exe 1
echo STOP2 >> E:\tmp\java\logfile.txt
当像这样运行两次时:
start test.bat && start test.bat
将失败,并显示一条或多条消息,如:
The process cannot access the file because it is being used by another process.
原因是“>>”重定向会打开文件以进行读/写访问,但仅打开文件共享。如果两个不同的程序尝试以这种方式打开文件,其中一个会失败
因此,您不能让两个不同的批处理文件同时运行并登录到同一个文件您可以尝试类似
http://www.nirsoft.net/utils/opened_files_view.html
调查到底发生了什么。@谢谢。我会立即尝试。当我知道更多信息时,我会更新状态。阅读(并实施)的所有建议。这可能会解决问题。如果没有,它应该提供有关失败原因的更多信息。然后忽略它引用的exec
,并使用ProcessBuilder
构建进程。还可以将String arg
分解为String[]args
来解释本身包含空格的参数。您是否查看了BATCHSTART和BATCHSTOP脚本的内容?我怀疑它们都试图写入同一个文件。Windows没有锁定cmd.exe。@AndrewThompson谢谢您的建议。我昨天已经快速查看了。我将处理您的其他评论关于ProcessBuilder和字符串数组。