我想在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%
答案 0 :(得分:2)
一次运行两个命令的语法错误。尝试在命令行中使用单个 &
而不是&&
。
我认为真正的问题是cmd.exe
在执行命令行之前执行所有变量替换(包括解析&&
)。当它找到尚未存在的变量的语法%HOSTNAME%
时,它会将文本保留为:%HOSTNAME%
。因此,尝试向同一进程发出两个命令,然后执行exit
命令。
另一种方法是将命令更改为:
set HOSTNAME=%COMPUTERNAME% & SET HOSTNAME
然后您将返回字符串"HOSTNAME=my_computer_name"
,您可以从中删除前导"HOSTNAME="
前缀。
答案 1 :(得分:2)
它与Java无关,因为它是cmd解析命令的方式。将立即解析整个命令以进行变量扩展。在解析命令时,该变量尚不可用,因此它将在批处理文件中替换为任何内容或在命令行中保持原样
您需要使用delayed expansion并使用!!
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%
就足够了。然而,它仍然不是有效的方式。 There are better ways to get hostname in Java
Map<String, String> env = System.getenv();
if (env.containsKey("COMPUTERNAME"))
return env.get("COMPUTERNAME");
或
InetAddress.getLocalHost().getHostName()