Ausgabe
Ich erstelle eine Java – Swing -Anwendung, in der ich Benutzereingaben entgegennehme, die als Argumente für eine Batch-Datei verwendet werden.
Nach dem Drücken einer Schaltfläche sollte meine Batchdatei zusammen mit den vom Benutzer bereitgestellten Argumenten im ADMIN-Modus gestartet werden.
Dies ist die Befehlszeile:
powershell Start-Process -Verb runas cmd '/k System.getProperty("user.dir") + batchFilePath +arg1+ "" +arg2 + "" +arg3'
Dieser Befehl funktioniert ordnungsgemäß, wenn wir ihn in das CMD-Fenster einfügen.
Aber ich möchte Code für eine Java-Anwendung, damit wir sie von ausführen können JButton
. Also habe ich dies als Eingabe verwendet ArrayList
und gegeben , aber ich erhalte eine Fehlermeldung.ArrayList
ProcessBuilder
Code:
String launchCMD= System.getProperty("user.dir") + batchFilePath +arg1+ "" +arg2 + "" +arg3
final ArrayList<String> commands = new ArrayList<String>();
commands.add("powershell Start-Process -Verb runas cmd \'/k ")
commands.add(launchCMD)
commands.add("\'" );
ProcessBuilder pr=new ProcessBuilder(commands);
pr.start();
Error:
java.io.IOException: Cannot run program ... : CreateProcess error=2, The system cannot find the file specified
Lösung
Ihre Frage bezieht sich nicht wirklich auf Swing , sondern auf die Verwendung der Klasse ProcessBuilder und diese Klasse ist kein Terminalemulator. Eine Befehlszeile, die Sie in ein PowerShell-Fenster eingeben, wird nicht analysiert. Sie müssen den Befehl in Token aufteilen. Deshalb ProcessBuilder
nimmt der Konstruktor eine Liste von Strings entgegen. Beachten Sie, dass die Parameter für den ProcessBuilder
Konstruktor keine Zeichenfolgenliterale sein müssen. Sie können einen String beliebig erstellen und als Argument an den ProcessBuilder
Konstruktor übergeben.
Sie haben keine Beispiel-Batchdatei gepostet, also habe ich eine eigene geschrieben, showargs.bat
die einfach ihr erstes Argument wiedergibt.
@echo off
echo %1
Der Befehl, der für mich funktioniert hat (dh die Batchdatei als Administrator ausgeführt hat), war:
powershell.exe -Command Start-Process cmd.exe -ArgumentList '/k C:\Users\USER\showargs.bat Diego' -Verb RunAs
Java-Code, der den obigen Befehl mit class ausführt ProcessBuilder
:
ProcessBuilder pb = new ProcessBuilder("powershell.exe",
"-Command",
"Start-Process",
"cmd.exe",
"-ArgumentList",
"'/k C:\\Users\\USER\\showargs.bat Diego'",
"-Verb",
"RunAs");
try {
Process proc = pb.start();
int status = proc.waitFor();
System.out.println("status = " + status);
}
catch (InterruptedException | IOException x) {
x.printStackTrace();
}
Beantwortet von – Abra
Antwort geprüft von – Senaida (FixError Volunteer)