Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 问题:连续两次启动cmd.exe_Java_Batch File_Process_Runtime.exec - Fatal编程技术网

Java 问题:连续两次启动cmd.exe

Java 问题:连续两次启动cmd.exe,java,batch-file,process,runtime.exec,Java,Batch File,Process,Runtime.exec,为了避免重复操作,我正在尝试自动化一些古代构建的流程。要求在一批中启动流程,在另一批中停止流程(顺便说一句,这是无法更改的) 因此,我制作了一个命令行工具来实现这一点(以及许多其他重复的东西),并对启动“startbatch”的命令和启动“stopbatch”的命令进行了建模。这两个命令分别运行良好(正如我分别测试它们时所做的),但当我想要一个接一个地执行它们时(当然是按照正确的顺序执行),似乎出现了问题。我在new cmd.exe窗口中遇到以下错误: 进程无法访问该文件,因为其他进程正在使用该

为了避免重复操作,我正在尝试自动化一些古代构建的流程。要求在一批中启动流程,在另一批中停止流程(顺便说一句,这是无法更改的)

因此,我制作了一个命令行工具来实现这一点(以及许多其他重复的东西),并对启动“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和字符串数组。