我试图自动化一些在古代构建的过程,以避免重复操作。要求进程以一个批处理开始,然后用另一个批处理停止(这不能改为btw)。
所以我制作了一个命令行工具(以及其他许多重复的东西),并且我已经建立了一个启动'startbatch'的命令和一个启动'stopbatch'的命令。两个命令分别正常工作(因为我分别测试它们)但是当我想要一个接一个地执行它们时(似乎是正确的顺序)似乎存在问题。我在新的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文件......
所以这个问题实际上是两个问题: - 描述问题的确切原因是什么? - 我如何以编程方式修复此问题(如果可能的话)?
提前感谢!
答案 0 :(得分:1)
所以,基本上,蝙蝠不是那么棒:-( 我能够从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.
原因是“>>”重定向会打开文件进行读/写访问,但只能打开FILE_SHARE_READ。如果两个不同的程序试图以这种方式打开文件,其中一个程序就会失败。
因此,您不能同时运行两个不同的批处理文件并记录到同一个文件