我在脚本中遇到$env:ComputerName
的值与 hostname.exe 命令的输出之间存在差异,该脚本根据预定义的集合检查计算机的主机名:
if ($env:ComputerName -in $hostnames) { ... }
但是,似乎我不能依赖$env:ComputerName
的值,因为它有时不同于网络上机器的主机名:
PS> hostname
Example
PS> $env:ComputerName
EXAMPLE
除了外壳,为什么这些会提供不同的值?在一台计算机上,名称在两个 hostname.exe 之间显着不同,输出预期名称,而$env:ComputerName
包含错误名称。 PowerShell是否从 hostname.exe 以外的其他来源检索值?
答案 0 :(得分:2)
主机名 - 显示计算机完整计算机名称的主机名部分。计算机主机名通常(但不总是)与%COMPUTERNAME%变量($ env:ComputerName正在使用)https://technet.microsoft.com/en-us/library/bb490919.aspx
相同我怀疑在最底层它们都保存在注册表数据库中,只是保存在不同的位置:
HKEY_CURRENT_USER\Environment
和
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName
您可以测试此猜测,但您需要重新启动计算机。
答案 1 :(得分:2)
$env
命名空间在从一组环境变量加载时由PowerShell.exe
填充。它从启动它的进程或从注册表中提取它们。 $env:COMPUTERNAME
应与%COMPUTERNAME%
环境变量匹配。值得注意的是,当环境变量的值发生变化时,不会在所有打开的进程中更新该值。
我不是100%确定hostname.exe
从中获取了什么,但我相信它需要在系统上加载TCP / IP。它可能正在查询主机网络适配器正在侦听的网络名称,或者可能正在查询网络配置(通过注册表或其他某种方法)。
两个值不匹配的最常见实例是在重命名计算机之后但在重新启动计算机之前完成名称更改。