[FIXED] Wie führe ich eine Batch-Datei mit Argumenten im Administratormodus über die JavaSwing-Schaltfläche mit dem Process Builder aus?

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 ArrayListund gegeben , aber ich erhalte eine Fehlermeldung.ArrayListProcessBuilder

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 ProcessBuildernimmt der Konstruktor eine Liste von Strings entgegen. Beachten Sie, dass die Parameter für den ProcessBuilderKonstruktor keine Zeichenfolgenliterale sein müssen. Sie können einen String beliebig erstellen und als Argument an den ProcessBuilderKonstruktor übergeben.

Sie haben keine Beispiel-Batchdatei gepostet, also habe ich eine eigene geschrieben, showargs.batdie 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like