[英]Windows - Using set and echo in Java program
我想在Java中設置並回顯Windows變量:
public static void main(String[] args) throws IOException
{
Runtime rt = Runtime.getRuntime();
String[] cmd = { "cmd.exe", "/c", "set HOSTNAME=%COMPUTERNAME% "
+ "&& echo %HOSTNAME%" };
Process proc = rt.exec(cmd);
BufferedReader stdInput = new BufferedReader(
new InputStreamReader(proc.getInputStream()));
BufferedReader stdError = new BufferedReader(
new InputStreamReader(proc.getErrorStream()));
System.out.println("Output:\n");
String s = null;
while ((s = stdInput.readLine()) != null)
{
System.out.println(s);
}
System.out.println("Error (if any):\n");
while ((s = stdError.readLine()) != null)
{
System.out.println(s);
}
}
我希望程序會打印出我的計算機主機名,或者將這個值用於其他目的。 但是輸出就像這樣:
Output:
%HOSTNAME%
Error (if any):
如何獲得在命令set HOSTNAME=%COMPUTERNAME%
的值
您一次運行兩個命令的語法是錯誤的。
嘗試在命令行中使用單個
&
而不是
&&
。
我認為真正的問題是cmd.exe
在執行命令行(包括解析&&
)之前執行了所有變量替換。 當它找到尚不存在的變量的語法%HOSTNAME%
(仍),它將文本保留為%HOSTNAME%
。 因此,請嘗試向同一進程發出兩個命令,然后發出一個exit
命令。
另一種方法是將命令更改為:
set HOSTNAME=%COMPUTERNAME% & SET HOSTNAME
然后,您將返回字符串"HOSTNAME=my_computer_name"
,從中可以刪除"HOSTNAME=my_computer_name"
的"HOSTNAME="
前綴。
它與Java無關,因為它是cmd解析命令的方式。 整個命令將立即解析以進行變量擴展。 在解析命令時,該變量尚不可用,因此將在批處理文件中將其替換為任何內容,或者在命令行中保留原樣
您需要使用延遲擴展並用!!
打印變量!!
cmd.exe /V:ON /c set HOSTNAME=%COMPUTERNAME% && echo !HOSTNAME!
/V:ON
用於啟用延遲擴展
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
[[/S] [/C | /K] string]
...
/V:ON Enable delayed environment variable expansion using ! as the
delimiter. For example, /V:ON would allow !var! to expand the
variable var at execution time. The var syntax expands variables
at input time, which is quite a different thing when inside of a FOR
loop.
在批處理文件中,可以通過setlocal EnableDelayedExpansion
啟用它
但是,僅出於此目的, cmd.exe /V:ON /c echo %COMPUTERNAME%
就足夠了。 但這仍然不是有效的方法。 有更好的方法來獲取Java中的主機名
Map<String, String> env = System.getenv();
if (env.containsKey("COMPUTERNAME"))
return env.get("COMPUTERNAME");
要么
InetAddress.getLocalHost().getHostName()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.