Почему мое Java-приложение успешно закрывает Windows Explorer, но не может перезапустить его снова?

В моем Java-приложении я использую

Runtime.getRuntime().exec("taskkill /F /IM " + explorer.exe).waitFor();

закрыть Проводник Windows. Эта часть работает, потому что Explorer действительно перестает работать на меня.

К сожалению, когда я использую

Runtime.getRuntime().exec("explorer.exe");

Проводник Windows вообще не перезагружается. Как мне правильно его перезапустить?

2 ответа

Решение

Я не знаю причину, по которой это не работает для вас, так как вы выполняете внешнюю программу из Java, я думаю, что это не вина Java, что она не перезапускается, возможно, что-то не так в перезапуске. Я дам вам альтернативу:

Вместо того, чтобы использовать Runtime.exec(), пытаться ProcessBuilder.start() для запуска процесса и использования метода destroy() из класса Process убить процесс. Все должно работать нормально, просто используйте конструктор, чтобы создать объект, представляющий проводник, и назначить его переменной типа Process,

Единственная причина, по которой я думаю, может быть, проще, если вы используете ProcessBuilder, потому что он принимает аргументы как отдельные строки, и, возможно, это облегчает настройку ваших скриптов.

Пример:

List<String> params = java.util.Arrays.asList("C:\myProgram.exe", "-arg1", "-arg2");
ProcessBuilder pb = new ProcessBuilder(params);
Process process = pb.start(); 

Попробуйте, я думаю, это должно сработать.

Наконец, я нашел метод, который работает для меня, мне помогла команда PowerShell "Stop-Process", и эта команда должна иметь параметр "-force". проверьте команду Stop-Process

   //java program
   ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "powershell","Stop-Process - 
   ProcessName explorer -Force");
   Process p = pb.start();
 

Я думаю, что проблема заключается в том, что после того, как вы убили [explorer.exe], вы не можете получить новую среду выполнения. Для меня работало повторное использование среды выполнения, которую я использовал для уничтожения [explorer.exe]. Я нашел это полезным для возможности редактировать определенные системные ресурсы из Java(TM).

public class KillRestart {
   public static void main (String [] args) {
      Runtime runtime = Runtime.getRuntime ();

      try {
         System.out.println ("Killing Explorer.exe process ... ");
         runtime.exec ("taskkill /F /IM explorer.exe /T").waitFor ();

         // Do something wild like update system resources

         System.out.println ("Resurrecting Explorer ...");
         runtime.exec ("explorer.exe");
      }
      catch (InterruptedException e) {
         e.printStackTrace ();
      }
      catch (IOException e) {
         e.printStackTrace ();
      }
   }
}
Другие вопросы по тегам