изменить каталог и запустить командный файл в той же командной строке - PullRequest
3 голосов
/ 13 февраля 2009

Есть ли способ открыть командную строку и изменить каталог в командной строке и запустить командный файл в той же командной строке, используя Java.

Я знаю, как открыть командную строку, используя Java. Спасибо,

Ответы [ 6 ]

8 голосов
/ 13 февраля 2009

Вы можете закодировать CD и командный файл в значение для cmd.exe / K. Из документа (cmd /?):

Обратите внимание, что несколько команд разделены разделителем команд '&&' принимаются за строку, если они заключены в кавычки.

Например:

cmd /C "CD C:\ && Dir"
cmd /C "CD C:\Windows && Dir"
cmd /C "CD C:\Windows && MySuperSuperBatchFile"

Для более подробной информации, запустите:

cmd /?

из командной строки.

7 голосов
/ 15 февраля 2009

Остерегайтесь исполнения Java. Он может зависнуть, если пакетный процесс заполняет выходной буфер, и вызвать другие странные проблемы.

Я предлагаю вам взглянуть на apache exec . Специально для ваших нужд вы должны отметить, что интерфейс Executor имеет метод setWorkingDirectory .

Основное использование:

Executor exec = new DefaultExecutor();
exec.setWorkingDirectory(new File("C:\\My\\Dir\\"));
CommandLine cl = new CommandLine("mybatch.bat");
int exitvalue = exec.execute(cl);
2 голосов
/ 14 февраля 2009

У пары java.lang.Runtime.exec () есть аргумент dir, поэтому я предполагаю, что вы не думаете об этом?

Вы можете скомпилировать следующую программу на C и выполнить ее как оболочку, чтобы запустить любую программу в любом каталоге, который вы хотите. Если вы используете массив String с Runtime.exec, вы избежите всех проблем, связанных с анализом командной строки / переносимостью / правильным цитированием аргументов.

У меня нет машины Windows для тестирования, но если вы скомпилируете C-программу для cdexe.exe, вы сможете использовать ее следующим образом:

public class Main {
        public static void main(String args[]) {
                String[] s = { "c:\\some\\place\\cdexe.exe",
                "c:\\start\\dir", "c:\\my\\batch\\file.bat", "arg1", "..." };
                try {
                        java.lang.Runtime.getRuntime().exec(s);
                } catch (java.io.IOException e) {
                        e.printStackTrace();
                }
        }
}

Я полагаю, что unistd.h может быть недоступен в Windows, но просто заменить на тот, который содержит прототип execv.

#include <stdio.h>
#include <unistd.h>  // or hard code "int execv(const char *path, char *const argv[]);"

int main(int argc, char *argv[])
{
        if (argc < 3) {
                fprintf(stderr, "Error: Usage: %s <directory> <program> [arguments]\n", argv[0]);
                return 1;
        }
        if (chdir(argv[1]) < 0) {
                perror("Error");
                fprintf(stderr, "chdir(%s) failed\n", argv[1]);
                return 1;
        }
        argv[1] = argv[2];
        execv(argv[1], &argv[2]);      // use execvp if you want PATH to be searched
        perror("Error");
        fprintf(stderr, "execv returned\n");
        return 0;
}
0 голосов
/ 13 февраля 2009

получить среду var "comspec" затем exec % comspec% / c start / d каталог / b batchfile.bat

0 голосов
/ 13 февраля 2009

Храните командный файл в «пути». Вы можете выполнить его, не переходя в какой-либо конкретный каталог.

(Например, вы можете иметь запись «set path =% path%; C: .......... \ YourBatchFile.bat» в Autoexec.bat в среде Windows)

0 голосов
/ 13 февраля 2009

Это трудно сделать из Java по глупым причинам независимости от платформы: в основном, что делать, если вы используете Java в системе, которая не имеет иерархических каталогов?

Существует несколько обходных путей в зависимости от того, что вы действительно пытаетесь сделать, но, возможно, самое простое - запустить возможную команду, используя java.lang.Runtime.exec().

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...