Почему мое 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 ();
}
}
}