207

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

Ryan Gates
  • 4,501
  • 6
  • 50
  • 90
George2
  • 44,761
  • 110
  • 317
  • 455

11 Answers11

295

You can just use the .NET Framework method:

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

also

$env:COMPUTERNAME

Strelok
  • 50,229
  • 9
  • 102
  • 115
  • 9
    Note: if your DNS name is longer than 15 characters, `[System.Net.Dns]::GetHostName()` (doesn't truncate) is better than `$env:COMPUTERNAME` (truncates) – sonjz Jul 19 '16 at 23:42
  • 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 Mar 14 '18 at 12:21
  • 3
    @mathisfun `$env:COMPUTERNAME` works fine on Windows 10 (please note dollar sign at the beginning) – oleksa Jun 19 '18 at 08:08
  • 2
    `$env:COMPUTERNAME` won't work on Linux and macOS. However, `[Environment]::MachineName` does. – felixfbecker May 30 '19 at 14:51
70

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

PS> hostname
KEITH1
jpaugh
  • 6,634
  • 4
  • 38
  • 90
40

Long form:

get-content env:computername

Short form:

gc env:computername
RaYell
  • 69,610
  • 20
  • 126
  • 152
18

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

 [System.Net.DNS]::GetHostByName('').HostName
grepit
  • 21,260
  • 6
  • 105
  • 81
8

A slight tweak on @CPU-100's answer, for the local FQDN:

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

Gary Pendlebury
  • 336
  • 5
  • 8
7

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

[Environment]::MachineName
felixfbecker
  • 2,273
  • 1
  • 19
  • 24
4

hostname also works just fine in Powershell

BillMux
  • 73
  • 2
  • 6
3

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
Garric
  • 591
  • 3
  • 10
3

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).

T S
  • 1,656
  • 18
  • 26
1

The most descriptive way for me is:

[System.Net.DNS]::GetHostByName($env:COMPUTERNAME).HostName
Gucu112
  • 877
  • 10
  • 12
1

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.

KentMarion
  • 35
  • 1
  • 10
  • This should be a comment. – Emil Sierżęga Jan 13 '22 at 09:58
  • This does not provide an answer to the question. Once you have sufficient [reputation](https://stackoverflow.com/help/whats-reputation) you will be able to [comment on any post](https://stackoverflow.com/help/privileges/comment); instead, [provide answers that don't require clarification from the asker](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead). - [From Review](/review/late-answers/30764121) – Emil Sierżęga Jan 13 '22 at 09:58