如何在 PowerShell 中获取本地主机名称?

问题描述 投票:0回答:12

如何在 PowerShell 中获取本地主机(计算机)名称?我正在使用 PowerShell 1.0。

.net powershell
12个回答
303
投票

您可以只使用.NET Framework方法:

[System.Net.Dns]::GetHostName()

还有

$env:COMPUTERNAME


71
投票

不要忘记所有旧的控制台实用程序在 PowerShell 中都可以正常工作:

PS> hostname
KEITH1

40
投票

长格式:

get-content env:computername

简称:

gc env:computername

18
投票

以上所有问题都是正确的,但如果您想要主机名和域名,请尝试以下操作:

 [System.Net.DNS]::GetHostByName('').HostName

8
投票

针对本地 FQDN,对 @CPU-100 的答案进行轻微调整:

[System.Net.DNS]::GetHostByName($Null).HostName


7
投票

在 PowerShell Core v6 中(适用于 macOS、Linux 和 Windows):

[Environment]::MachineName

5
投票

hostname
在 Powershell 中也能正常工作


3
投票

Powershell 中 bat 文件代码的类似物

命令

wmic path Win32_ComputerSystem get Name

Powershell

Get-WMIObject Win32_ComputerSystem | Select-Object -ExpandProperty name

还有...

hostname.exe

3
投票

并非专门针对 Powershell 1.0 版本,更多的是通过 Powershell 获取信息的不同可能方法的概述:

Add-Type -TypeDefinition @'
    public enum COMPUTER_NAME_FORMAT{
        ComputerNameNetBIOS,
        ComputerNameDnsHostname,
        ComputerNameDnsDomain,
        ComputerNameDnsFullyQualified,
        ComputerNamePhysicalNetBIOS,
        ComputerNamePhysicalDnsHostname,
        ComputerNamePhysicalDnsDomain,
        ComputerNamePhysicalDnsFullyQualified,
        ComputerNameMax,
    }
    public static class Kernel32{
        [System.Runtime.InteropServices.DllImport("Kernel32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        public static extern bool GetComputerNameEx(COMPUTER_NAME_FORMAT NameType, System.Text.StringBuilder lpBuffer, ref uint lpnSize);
    }
'@
$len = 0
[Kernel32]::GetComputerNameEx([COMPUTER_NAME_FORMAT]::ComputerNameDnsFullyQualified, $null, [ref]$len); #get required size
$sb = [System.Text.StringBuilder]::new([int]$len) #create StringBuilder with required capacity (ensure int constructor is used, otherwise powershell chooses string constructor for uint value...)
$len = $sb.Capacity #get actual capacity of StringBuilder (important, as maybe StringBuilder was constructed differently than expected)
[Kernel32]::GetComputerNameEx([COMPUTER_NAME_FORMAT]::ComputerNameDnsFullyQualified, $sb, [ref]$len);
$sb.ToString()

返回“唯一标识本地计算机的完全限定 DNS 名称。此名称是 DNS 主机名和 DNS 域名的组合,使用形式 HostName.DomainName。如果本地计算机是群集中的节点,则 lpBuffer接收群集虚拟服务器的完全限定 DNS 名称。”
有关

GetComputerNameEx
API 函数的信息有关
COMPUTER_NAME_FORMAT
枚举的信息
使用了
COMPUTER_NAME_FORMAT
的 C# 签名(非官方)
使用了
GetComputerNameEx
的 C# 签名(非官方)
short关于 powershell 中的 P/Invoke 的博文)
注意:请谨慎使用 P/Invoke。足够不正确的使用实际上可能会导致 powershell 崩溃。
Add-Type
调用有点慢(但只需要在脚本中调用一次)。


2
投票

对我来说最具描述性的方式是:

[System.Net.DNS]::GetHostByName($env:COMPUTERNAME).HostName

1
投票

您可以按如下方式存储该值

$name = $(hostname)

我想补充一点,只需执行

$name = hostname
也会将 PC 的本地主机名称保存到变量中。


0
投票

如果您想要主机名,请不要使用 $env:computername 。 我遇到的情况是 $env:computername 截断了最后一个字母,而主机名将返回全名。 enter image description here

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.