连续两次启动cmd.exe

时间:2013-07-08 13:38:21

标签: java batch-file process runtime.exec

我试图自动化一些在古代构建的过程,以避免重复操作。要求进程以一个批处理开始,然后用另一个批处理停止(这不能改为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文件......

所以这个问题实际上是两个问题: - 描述问题的确切原因是什么? - 我如何以编程方式修复此问题(如果可能的话)?

提前感谢!

1 个答案:

答案 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。如果两个不同的程序试图以这种方式打开文件,其中一个程序就会失败。

因此,您不能同时运行两个不同的批处理文件并记录到同一个文件