繁体   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