这似乎是 Java 和外部进程之间的真正问题
在 Windows 7 和 Java 7(32位)上如下:
ProcessBuilder b = new ProcessBuilder();
Map<String, String> env = b.environment();
for (String key : env.keySet())
System.out.println(key + ": " + env.get(key));
生成
SystemRoot: C:\Windows
Path: xbox
这意味着运行程序的环境和子进程的环境应该包含一个路径变量,其值恰好为“xbox”(例如,胡说八道,在我的电脑上没有名为xbox的目录)
仅供参考:
Map<String, String> env = System.getenv();
for (String key : env.keySet())
System.out.println(key + ": " + env.get(key));
会得到完全相同的结果。
当我运行时
b.command("convert.exe", "/?").inheritIO().start();
通过这个流程构建器和环境,我得到了:
Konvertiert FAT-Volumes in NTFS.
CONVERT Volume /FS:NTFS [/V] [/CvtArea:Dateiname] [/NoSecurity] [/X]
Volume Bestimmt den Laufwerkbuchstaben (gefolgt von einem Doppelpunkt),
den Bereitstellungspunkt oder das Volume.
/FS:NTFS Bestimmt das in NTFS zu konvertierende Volume.
/V Legt fest, dass CONVERT im ausf�hrlichen Modus ausgef�hrt wird.
/CvtArea:Dateiname
Bestimmt die zusammenh�ngende Datei im Stammverzeichnis, die als
Platzhalter f�r NTFS-Systemdateien dienen soll.
/NoSecurity Bestimmt die Sicherheitseinstellungen f�r konvertierte Dateien
und Verzeichnisse, die f�r jeden Benutzer zug�nglich sind.
/X Erzwingt ggf. das Aufheben der Bereitstellung.
Alle ge�ffneten Handles auf das Volume sind in diesem Fall
ung�ltig.
这是(德语)输出的结果
C:\Windows\System32\convert.exe
当我使用时,同样的情况发生
Runtime.getRuntime().exec(new String[]{"convert.exe", "/?"});
请注意,我的环境非常小,因为我替换了本机环境。这意味着整个程序仅具有这两个环境变量。
System.getenv
javadoc),这意味着您可以使用类似的结果交替调用System.getenv("path")
或System.getenv("PATH")
。但是对于ProcessBuilder的环境字段来说却并非如此,因为该映射是直接访问而不是通过特定的getter访问,所以任何大小写上的差异都会导致错误...提示:如果您确实想在Windows中获取ProcessBuilder的路径,请使用environment.get("Path")
。 - PeterT