2017-10-16 4 views
7

Java 9 hübsche Weise provied Informationen der Process zu bekommen, aber ich weiß noch nicht, wie die CommandLine & arguments des Prozess zu erhalten:Wie command & Argumente des Prozesses in Java erhalten 9

Process p = Runtime.getRuntime().exec("notepad.exe E:\\test.txt"); 
ProcessHandle.Info info = p.toHandle().info(); 
String[] arguments = info.arguments().orElse(new String[]{}); 
System.out.println("Arguments : " + arguments.length); 
System.out.println("Command : " + info.command().orElse("")); 
System.out.println("CommandLine : " + info.commandLine().orElse("")); 

Ergebnis:

Arguments : 0 
Command : C:\Windows\System32\notepad.exe 
CommandLine : 

Aber ich erwarte:

Arguments : 1 
Command : C:\Windows\System32\notepad.exe 
CommandLine : C:\Windows\System32\notepad.exe E:\\test.txt 
+1

einfach weiter zu debuggen, können Sie versuchen, Ihre ProcessHandler 'p.toHandle()' 'mit ProcessHandle.current()' ersetzen und ausführen, wenn Sie einige Werte in den erwarteten Bereichen erhalten, um zu sehen,? Meistens ist es interessant zu sehen, ob der Prozess-Handler Ihres aktuellen Prozesses geeignet ist oder nicht. – nullpointer

+0

Nicht glücklich, immer noch gleich. – Jerry06

Antwort

1

Versuchen ProcessBuilder statt Runtime#exec()

Process p = new ProcessBuilder("notepad.exe", "E:\\test.txt").start(); 

Oder eine andere Art und Weise zu verwenden, um einen Prozess zu erstellen:

Process p = Runtime.getRuntime().exec(new String[] {"notepad.exe", "E:\\test.txt"}); 
+0

Es ist das gleiche Ergebnis. Ich habe es vor dem Wechsel zu Runtime.getRuntime() versucht – Jerry06

+0

hast du den gleichen Befehl wie ich erwähnt? Oder 'Process p = Runtime.getRuntime(). Exec (" notepad.exe ", neue Zeichenfolge [] {" E: \\ test.txt "});' –

+0

ja, habe es einfach und das gleiche Ergebnis. Ich denke, das ist ein Fehler von Java 9 – Jerry06

5

scheint dies in JDK-8176725 berichtet wurde. Hier ist der Kommentar beschreibt das Problem:

Die Befehlszeilenargumente über eine nicht-privilegierten API für andere Prozesse nicht verfügbar sind und so die Optional ist immer leer. Die API gibt explizit an, dass die Werte für das Betriebssystem spezifisch sind. Wenn die Argumente in Zukunft von einer Fenster-API zur Verfügung gestellt werden, kann die Implementierung aktualisiert werden.

BTW, die Infostruktur wird durch nativen Code gefüllt; Die Zuweisungen zu den Feldern erscheinen nicht im Java-Code.

+0

Ja, schien dies unter Linux, MacOS, aber nicht in Window jetzt funktioniert. – Jerry06

+0

Nicht ganz sicher über die Auflösung dieses Bugs, aber es scheint wie markiert, dass als * Future Project * aufgenommen würde. – nullpointer