hostname.exe 和 $env:ComputerName 的输出之间的区别?

Difference between the output of hostname.exe and $env:ComputerName?

我在一个脚本中遇到 $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 的来源检索值?

主机名 - 显示计算机全名的主机名部分。计算机主机名通常(但不总是)与 %COMPUTERNAME% 变量($env:ComputerName 使用的变量)相同https://technet.microsoft.com/en-us/library/bb490919.aspx

我怀疑在最底部它们都保存在注册表数据库中,只是位置不同: HKEY_CURRENT_USER\EnvironmentHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName

你可以测试这个猜测,但你需要重新启动你的机器。

$env 命名空间在从环境变量集加载时由 PowerShell.exe 填充。它从启动它的进程或注册表中提取这些信息。 $env:COMPUTERNAME 应该匹配 %COMPUTERNAME% 环境变量。值得注意的是,当环境变量的值发生变化时,它 不会 在所有打开的进程中更新该值。

我不是 100% 确定 hostname.exe 的来源,但我相信它需要在系统上加载 TCP/IP。它可能正在查询主机网络适配器正在侦听的网络名称,或者可能正在查询网络配置(通过注册表或其他一些方法)。

最常见的两个值不匹配的情况是在重命名计算机之后但在重新启动以完成名称更改之前。