221

How do I get the localhost (machine) name in PowerShell? I am using PowerShell 1.0.

13 Answers 13

312

You can just use the .NET Framework method:

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

also

$env:COMPUTERNAME

Sign up to request clarification or add additional context in comments.

4 Comments

Note: if your DNS name is longer than 15 characters, [System.Net.Dns]::GetHostName() (doesn't truncate) is better than $env:COMPUTERNAME (truncates)
On Windows 10 Enterprise, env:COMPUTERNAME produced the following error: env:COMPUTERNAME : The term 'env:COMPUTERNAME' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At line:1 char:1 + env:COMPUTERNAME + ~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (env:COMPUTERNAME:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException
@mathisfun $env:COMPUTERNAME works fine on Windows 10 (please note dollar sign at the beginning)
$env:COMPUTERNAME won't work on Linux and macOS. However, [Environment]::MachineName does.
74

Don't forget that all your old console utilities work just fine in PowerShell:

PS> hostname
KEITH1

2 Comments

This is a good answer, however, if you want to save the value in a variable then use the accepted answer.
You can store the value as follows $name = $(hostname)
39

Long form:

get-content env:computername

Short form:

gc env:computername

4 Comments

supershort: $env:COMPUTERNAME
This will work fine, until you have a server with a name longer than 15 characters.
@GaryPendlebury what will happen then?
@Sajuuk computername is the NetBIOS name, which is limited to 15 characters.
20

All above questions are correct but if you want the hostname and domain name try this:

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

Comments

12

A slight tweak on @grepit's answer, for the local FQDN:

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

Comments

11

In PowerShell Core v6 (works on macOS, Linux and Windows):

[Environment]::MachineName

1 Comment

Unlike most of the alternatives, this converts the hostname to upper-case for me.
10

Not specifically for Powershell version 1.0 and more of an overview of different possible ways to get information via 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()

Returns "The fully qualified DNS name that uniquely identifies the local computer. This name is a combination of the DNS host name and the DNS domain name, using the form HostName.DomainName. If the local computer is a node in a cluster, lpBuffer receives the fully qualified DNS name of the cluster virtual server."
(Info about the GetComputerNameEx API function, Info about the COMPUTER_NAME_FORMAT enumeration, used c# signature of COMPUTER_NAME_FORMAT (unofficial), used c# signature of GetComputerNameEx (unofficial), short blogpost about P/Invoke in powershell)
Note: Use P/Invoke with caution. Sufficiently incorrect usage can actually make powershell crash. The Add-Type call is somewhat slow (but only needs to be called once in the script).

Comments

5

An analogue of the bat file code in Powershell

Cmd

wmic path Win32_ComputerSystem get Name

Powershell

Get-WMIObject Win32_ComputerSystem | Select-Object -ExpandProperty name

and ...

hostname.exe

Comments

4

hostname also works just fine in Powershell

1 Comment

I can confirm that this works on PowerShell Core 7.3.1 on macOS as well as PowerShell on Windows 10.
2

if you want the hostname don't user $env:computername . I had just the case where $env:computername cut off the last letter where as hostname would return to full name. enter image description here

Comments

1

The most descriptive way for me is:

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

1 Comment

No need. Just use '' instead of the environment variable.
0

You can store the value as follows $name = $(hostname)

I want to add that simply executing $name = hostname will also save the localhost name of the PC into a variable.

3 Comments

This should be a comment.
This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review
it answers it. However, it's redundant, since an answer including solely hostname exists.
0

I loved the code posted by T S above, and the links and explanations he posted, very thankful.

I got his code and wrapped into a function and cut all the other output, just to output the computer name. in my case this is very handy as it tells me which domain my computer lives in.

function Get-FullyQualifiedComputerName {
    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);
    }
'@ | Out-Null

    $len = 0
    [Kernel32]::GetComputerNameEx([COMPUTER_NAME_FORMAT]::ComputerNameDnsFullyQualified, $null, [ref]$len) | Out-Null
    $sb = [System.Text.StringBuilder]::new([int]$len)
    $len = $sb.Capacity
    [Kernel32]::GetComputerNameEx([COMPUTER_NAME_FORMAT]::ComputerNameDnsFullyQualified, $sb, [ref]$len) | Out-Null
    return $sb.ToString().Trim()
}

# Example of how to use it:


$fullyQualifiedComputerName = Get-FullyQualifiedComputerName
Write-Output $fullyQualifiedComputerName

enter image description here

1 Comment

This works, but how is it better than the calls to DotNet in the other answers?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.