Runtime.exec для аргумента, содержащего несколько пробелов - PullRequest
7 голосов
/ 14 июля 2011

Может ли кто-нибудь выполнить следующий запуск?

public class ExecTest {
  public static void main(String[] args) {
    try {
      //Notice the multiple spaces in the argument
      String[] cmd = {"explorer.exe", "/select,\"C:\\New      Folder\\file.txt\""};

      //btw this works
      //String cmd = "explorer.exe /select,\"C:\\New Folder\\file.txt\"";

      //and surprisingly this doesn't work
      //String[] cmd = {"explorer.exe", "/select,\"C:\\New Folder\\file.txt\""};

      //Update: and (as crazy as it seems) the following also worked
      //String[] cmd = {"explorer.exe", "/select,\"C:\\New", "Folder\\file.txt\""};

      Runtime.getRuntime().exec(cmd);
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

Использование Java 6. Протестировано под Vista x64.Кстати, если взять исполняемую строку (вам нужно будет использовать String-версию exec для ее получения) и использовать ее в поле Поиск в меню «Пуск» Vista, то все будет работать как положено.
Любая помощь будет оценена.Я схожу с ума ..!

Обновление: я добавил решение для 2-й странной вещи, на которую указывает мой пост, что 2 версии exec ведут себя по-разному.Решение основано на ответе от prunge.Спасибо еще раз.

Ответы [ 8 ]

6 голосов
/ 16 июля 2011

Хорошо, это не просто обновление, но также и ответ, поэтому я подаю его как единое целое.Согласно всей информации, которую я смог найти, теоретически это должно сделать следующее:

String [] cmd = {"explorer.exe", "/ select, \" C: \ New "," ", "", "", "", "", "", "Folder \ file.txt \" "};

Несколько пробелов разбиты на пустые строки и версию массиваexec используется.Используя приведенный выше массив, я отлаживал цикл в строках 50-75 файла java.lang.ProcessImpl, где наконец была создана строка.Полученная строка была:

explorer.exe / select, "C: \ New Folder \ file.txt"

Это то, что передается в качестве 1-го аргумента методу native create ProcessImpl (строка 118 того же класса), которая, как кажется, не может правильно выполнить эту команду .

Так что, я думаю, все здесь заканчивается ... к сожалению.

Thnx prunge forуказывая на ошибку Java.Спасибо всем за их время и интерес!

5 голосов
/ 16 ноября 2012

Чудо, оно работает!

Не спрашивайте меня, почему, но когда я, после довольно долгого нервного исследования в интернете, был близок к тому, чтобы сдатьсяи использовать временный пакетный файл в качестве обходного пути, я забыл добавить параметр / select, к команде, и, кто бы мог подумать, в моей системе Win 7 32Bit работает следующее.

String param = "\"C:\\Users\\ME\\AppData\\Local\\Microsoft\\Windows\\Temporary Internet Files\\\"";
try {
    String[]commands = new String[]{"explorer.exe", param};
    Process child = Runtime.getRuntime().exec(commands);
} catch (IOException e1) {
    System.out.println("...");
}

Общее решение:

Решение базы данных об ошибках, упомянутое prunge в его посте (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511002) работало нормально для меня.

Причина:

Очевидно, что проблема заключается в комментировании некоторых символов, выполняемых java, которое он выполняет перед фактическим выполнением командной строки. Вы должны сами комментировать, маркируя свою командную строку, чтобы предотвратить ошибочную javaодин, чтобы вступить в действие и все испортить.

Как исправить:

Итак, в моем случае мне пришлось сделать следующее (токенизация моей командной строки, такчто внутри не осталось пробеловстрока ):

String param[] = {
    "explorer.exe",
    "/select,C:\\Users\\ME\\AppData\\Local\\Microsoft\\Windows\\Temporary",
    "Internet",
    "Files\\"};

try {
    Process child = Runtime.getRuntime().exec(param);
} catch (IOException e1) {
    System.out.println("...");
}

Как вы можете видеть, я в основном начинал новую строку везде, где возникал пробел, поэтому «Временные файлы Интернета» стали «Временные», «Интернет», «Файлы».

5 голосов
/ 14 июля 2011

Всегда используйте Runtime.exec (String []), а не Runtime.exec (String), если командная строка не очень проста.

2 голосов
/ 14 июля 2011

Сначала используйте new File(pathName).canExecute(), чтобы проверить, является ли он исполняемым или нет

EDIT:

public static void runAll(String... cmd)
{
    for(String s : cmd)
    {
        try
        {
            Runtime.getRuntime().exec(cmd);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

и затем вы можете использовать его как: runAll("explorer.exe", "taskmgr.exe");

1 голос
/ 30 сентября 2013

Символы ,-& и двойные пробелы, вместе взятые, являются кошмаром!

Все приведенные здесь ответы не дали результата "\\NAS\media\Music\Artistes\E\Earth, Wind & Fire\1992 - The eternal dance - Vol. 1 (1971-1975) (двойной пробел между «Том 1» и «(1971»).

У меня нет другого выбора, кроме как записать временный пакетный файл:

   void openFolderOf( Album album ) {
      try {
         final String path = album._playList.getParent();
         final File batch = File.createTempFile( getClass().getSimpleName(), ".bat" );
         try( PrintStream ps = new PrintStream( batch )) {
            ps.println( "explorer.exe \"" + path + '"' );
         }
         Runtime.getRuntime().exec( batch.getAbsolutePath());
      }
      catch( final Throwable t ) {
         t.printStackTrace();
      }
   }

Примечание: на cmd.exe строка explorer "\\NAS..." работает хорошо, но не с Runtime.exec () иProcessBuilder.

1 голос
/ 14 июля 2011

Может быть ошибка Java.См .: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6511002

Сделал небольшую отладку из любопытства, я думаю, что вещи становятся неприкрепленными в java.lang.ProcessImpl (см. Конструктор).Заметил, что при фактическом вызове базового API-интерфейса Windows строка превратилась в

explorer.exe "/ select," c: \ New Folder \ test.txt ""

, так чтоможет объяснить, почему, в качестве обходных путей, смотрите ссылку на базу данных ошибок.

0 голосов
/ 15 августа 2017

В вашем конкретном случае, когда вам нужна команда открытия / выбора, я обошёл кошмар цитаты Windows, используя команду cmd / c start:

String[] cmd = {"cmd", "/c", "start explorer.exe /select," + path};

Где path - абсолютный путь от объекта File.

0 голосов
/ 11 ноября 2013

Простой способ решить эту проблему для файлов - java.awt.Desktop Начиная с версии 1.6. Пример:

   Desktop.getDesktop().open(new File(fullFileName));
...