簡體   English   中英

Windows-在Java程序中使用設置和回顯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM