2013-07-08 2 views
3

Я пытаюсь автоматизировать некоторые процессы, которые были построены в древние времена, ради избежания повторяющихся действий. Требуется, чтобы процессы запускались с одной партией и останавливались с другой (это не может быть изменено кстати).Проблема с запуском cmd.exe дважды в строке

Итак, я сделал инструмент командной строки для этого (и много других повторяющихся вещей), и я смоделировал команду, которая запускает «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(); 
    } 
} 

Имена batchfiles сцепляются, но они в порядке, как только приложение запущено.

Сообщение об ошибке довольно ясно, некоторые файлы заблокированы, и я не могу получить к нему доступ из-за этого. Некоторые поисковые запросы подтверждают мои подозрения, но я не могу найти решение для этого. Хиты в google - все о очевидном использовании файлов, таких как очевидный общий ресурс. Но в моем случае я не работаю над одним и тем же командным файлом. Пакет остановки и запуска - это два разных файла. Поэтому я действительно начинаю думать, что это может быть файл cmd.exe, который блокируется окнами ...

Так что этот вопрос на самом деле два вопроса: - в чем же причина описанной проблемы? - как я программно исправляю это (если возможно)?

благодарит заранее!

+1

Вы можете попробовать инструмент, как 'HTTP: // www.nirsoft.net/Utils/opened_files_view.html' чтобы выяснить, что происходит. – Gene

+0

@Gene спасибо. Я попробую сразу. Я обновлю статус, когда узнаю больше. – anothernoc

+1

Прочитайте (и внесите) * все * рекомендации [Когда Runtime.exec() не будет] (http://www.javaworld.com/jw-12-2000/jw-1229-traps.html). Это может решить проблему. Если нет, он должен предоставить дополнительную информацию о причине отказа. Затем проигнорируйте, что он ссылается на 'exec' и создает' Process' с помощью 'ProcessBuilder'. Также разбивайте 'String arg' на' String [] args' для учета аргументов, которые сами содержат пробелы. –

ответ

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. 

причина в том, что ">>" REDIR ection открывает файл для чтения/записи, но только FILE_SHARE_READ. Если две разные программы пытаются открыть файл таким образом, один из них не работает.

Таким образом, вы не можете иметь два различных пакетных файлов, выполняющихся в то же время и при входе в тот же файл

Смежные вопросы