cheat sheet

hostname

Display the DNS hostname of the local Windows machine from the command prompt — useful in scripts to identify the machine without parsing systeminfo output.

hostname — Print Machine Name

What it is

hostname is a built-in Windows command that prints the NetBIOS / DNS hostname of the local machine to stdout. It takes no arguments and produces a single line of output — making it ideal for scripts that need to label output or branch on machine identity without shelling out to systeminfo or WMI.

Availability

hostname ships as C:\Windows\System32\hostname.exe on every Windows version since NT 4.0. PowerShell equivalent: $env:COMPUTERNAME or [System.Net.Dns]::GetHostName().

cmd
hostname /?

Output:

sql
Prints the name of the current host.

HOSTNAME

Basic usage

Running hostname with no arguments prints the machine name and exits.

cmd
hostname

Output:

code
myhost

Capturing the hostname in a batch variable

Assign the output of hostname to a variable with for /f so it can be reused in the same script.

cmd
for /f "delims=" %h in ('hostname') do set MACHINE=%h
echo %MACHINE%

Output:

code
myhost

In a batch file use double %%h:

cmd
@echo off
for /f "delims=" %%h in ('hostname') do set MACHINE=%%h
echo Running on %MACHINE%

Output:

csharp
Running on myhost

Using %COMPUTERNAME% as an alternative

%COMPUTERNAME% is an environment variable that holds the same NetBIOS machine name as hostname. It is always available without a subprocess call, making it marginally faster in scripts.

cmd
echo %COMPUTERNAME%

Output:

code
MYHOST
cmd
rem %COMPUTERNAME% is uppercase; hostname output matches the stored name
hostname

Output:

code
myhost

Hostname in log file names

Embedding the hostname in a file name makes log rotation across multiple machines trivial.

code
systeminfo > C:\Logs\sysinfo_%COMPUTERNAME%.txt
echo Written to sysinfo_%COMPUTERNAME%.txt

Output:

css
Written to sysinfo_MYHOST.txt

Checking hostname on a remote machine

hostname only reports the local machine. To get a remote machine's hostname by IP, use nslookup or ping -a.

cmd
ping -a 192.168.1.100 -n 1

Output:

python
Pinging myhost [192.168.1.100] with 32 bytes of data:
Reply from 192.168.1.100: bytes=32 time<1ms TTL=128

Three layers of "machine name" on Windows

Windows actually tracks several distinct names for the same machine, and they don't always agree. Understanding which command returns which name is the difference between a script that works and one that mysteriously targets the wrong host.

SourceReturnsMaximum lengthSet by
hostname.exeDNS host label (lowercase as stored)63 chars (DNS) / 15 chars (NetBIOS)Rename-Computer, SCCM, sysprep
%COMPUTERNAME%NetBIOS name (always UPPER)15 charsSession env at logon
[Dns]::GetHostName()DNS host label (as stored)63 charsSame as hostname.exe
[Dns]::GetHostEntry('').HostNameFQDN if domain-joined255 charsDNS suffix + host name
(Get-CimInstance Win32_ComputerSystem).NameNetBIOS name (UPPER)15 charsWMI
(Get-CimInstance Win32_ComputerSystem).DNSHostNameDNS host (lowercase)63 charsWMI

A machine renamed to BuildServer01 but still in the corp.example.com AD domain will return:

CommandOutput
hostnameBuildServer01
echo %COMPUTERNAME%BUILDSERVER01
[Dns]::GetHostEntry('').HostNameBuildServer01.corp.example.com
powershell
[System.Net.Dns]::GetHostName()
[System.Net.Dns]::GetHostEntry('').HostName

Output:

code
BuildServer01
BuildServer01.corp.example.com

PowerShell equivalents and richer queries

PowerShell exposes the same name through several APIs. Each is preferable in different contexts — $env:COMPUTERNAME for speed, Get-CimInstance for cross-machine inventory, .NET [Dns] for FQDN logic.

powershell
$env:COMPUTERNAME

Output:

code
MYHOST
powershell
hostname

Output:

code
MYHOST
powershell
(Get-CimInstance Win32_ComputerSystem).Name

Output:

code
MYHOST
powershell
Get-CimInstance Win32_ComputerSystem | Select-Object Name, DNSHostName, Domain, Workgroup, PartOfDomain

Output:

yaml
Name        : MYHOST
DNSHostName : MYHOST
Domain      : corp.example.com
Workgroup   :
PartOfDomain: True
powershell
Get-ComputerInfo -Property CsName, CsDNSHostName, CsDomain, CsDomainRole

Output:

yaml
CsName        : MYHOST
CsDNSHostName : MYHOST
CsDomain      : corp.example.com
CsDomainRole  : MemberWorkstation

FQDN, domain, and DNS suffix

The fully-qualified domain name is the hostname plus the connection-specific DNS suffix or the primary DNS suffix. hostname never returns the FQDN — use .NET [Dns]::GetHostEntry or read the suffix directly.

powershell
[System.Net.Dns]::GetHostEntry($env:COMPUTERNAME).HostName

Output:

code
MYHOST.corp.example.com
cmd
ipconfig /all | findstr /C:"Primary Dns Suffix" /C:"Host Name"

Output:

yaml
   Host Name . . . . . . . . . . . . : MYHOST
   Primary Dns Suffix  . . . . . . . : corp.example.com
powershell
Get-DnsClientGlobalSetting | Select-Object SuffixSearchList

Output:

markdown
SuffixSearchList
----------------
{corp.example.com, lab.example.com}

Renaming the machine

Rename-Computer is the modern PowerShell way to change a Windows machine's name; it updates both the NetBIOS name and the DNS host label. A reboot is required for the change to take full effect. The legacy netdom renamecomputer command does the same thing on Server SKUs.

powershell
Rename-Computer -NewName "BUILDSERVER02" -Force -Restart

Output:

vbnet
WARNING: The changes will take effect after you restart the computer MYHOST.

For a domain-joined machine the operation requires domain admin credentials so AD can update the computer account at the same time:

powershell
Rename-Computer -NewName "BUILDSERVER02" -DomainCredential CORP\alicedev -Force -Restart

Output:

vbnet
WARNING: The changes will take effect after you restart the computer MYHOST.

The legacy CMD equivalent on Server editions:

cmd
netdom renamecomputer MYHOST /NewName:BUILDSERVER02 /UserD:CORP\alicedev /PasswordD:* /Force /Reboot:0

Output:

css
The computer needs to be restarted in order to complete the operation.
The command completed successfully.

Reading machine name from the registry

The persisted hostname lives in two registry keys; reading them works even when WMI is broken or the machine is offline (via offline registry mounting).

cmd
reg query "HKLM\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName" /v ComputerName
reg query "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v Hostname
reg query "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v "NV Hostname"

Output:

markdown
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName
    ComputerName    REG_SZ    MYHOST

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
    Hostname    REG_SZ    MYHOST

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
    NV Hostname    REG_SZ    MYHOST

If those three values disagree, the machine is mid-rename and waiting for a reboot.

Common pitfalls

  1. hostname vs %COMPUTERNAME% — both return the machine name but hostname invokes a subprocess; prefer %COMPUTERNAME% in tight loops.
  2. Case differencehostname.exe returns the name as stored (often lower-case or mixed); %COMPUTERNAME% is always upper-case. Normalise with for /f "usebackq" %%h in (hostname) do ... when case matters.
  3. No remote queryinghostname has no /S flag; use nslookup <IP>, ping -a <IP>, or WMI for remote lookups.
  4. FQDN vs short namehostname returns only the short (NetBIOS) name. For the fully-qualified domain name use PowerShell: [System.Net.Dns]::GetHostEntry('').HostName.
  5. 15-character NetBIOS cap — NetBIOS names are limited to 15 characters; longer DNS host labels work locally but break legacy SMB/RPC name resolution. Tools that read %COMPUTERNAME% silently truncate.
  6. Stale %COMPUTERNAME% after rename — the env var is set at user logon; after Rename-Computer it stays at the old name until the next sign-in even though hostname.exe already returns the new one.
  7. Pending rename hides the new name — after Rename-Computer (without -Restart) hostname may still report the old name until reboot; check HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\NV Hostname for the queued value.
  8. Sysprepped images — a machine cloned without sysprep keeps the source machine's name and SID; hostname reports the duplicated name, AD will refuse the second join.
  9. _CLUSTER_NETWORK_NAME_ overrides hostname output — Microsoft Learn documents that when this environment variable is defined (Windows clustering sets it inside resource scripts), hostname.exe prints the variable's value instead of the real machine name. Useful for cluster-aware scripts; surprising in non-cluster contexts where a stray set leaks the value.
  10. TCP/IP must be installedhostname.exe is only available when the Internet Protocol (TCP/IP) component is bound to a network adapter; on stripped-down container images that omit TCP/IP it returns an error. %COMPUTERNAME% works regardless.
  11. Any argument other than /? is an errorhostname foo doesn't print anything new; it just prints an error message and exits with errorlevel 1. There is no -s, -f, -d, or -i like the Unix tool.

Real-world recipes

Label a multi-machine inventory script

cmd
@echo off
for /f "delims=" %%h in ('hostname') do set H=%%h
echo %H%,%DATE%,%TIME% >> C:\Audit\inventory.csv
systeminfo /FO CSV /NH >> C:\Audit\inventory.csv
echo %H% logged.

Output:

code
MYHOST logged.

Conditional logic based on machine name

cmd
@echo off
for /f "delims=" %%h in ('hostname') do set H=%%h
if /i "%H%"=="buildserver" (
    echo Running build tasks
) else (
    echo Skipping — not the build server
)

Output:

code
Skipping — not the build server

Include hostname in a support-ticket dump

cmd
echo === Machine: %COMPUTERNAME% === > support.txt
echo === Date: %DATE% %TIME% === >> support.txt
ipconfig /all >> support.txt
echo Done. Send support.txt to the helpdesk.

Output:

css
Done. Send support.txt to the helpdesk.

Roll a fleet-wide hostname inventory with PowerShell remoting

Invoke-Command runs the same script block against many machines in parallel — far better than a serial for loop. Combine with Get-CimInstance for richer detail than hostname alone.

powershell
$targets = 'web01', 'web02', 'db01', 'build01'
Invoke-Command -ComputerName $targets -ScriptBlock {
    [PSCustomObject]@{
        NetBIOS = $env:COMPUTERNAME
        DnsHost = [System.Net.Dns]::GetHostName()
        FQDN    = [System.Net.Dns]::GetHostEntry('').HostName
        Domain  = (Get-CimInstance Win32_ComputerSystem).Domain
    }
} | Format-Table -AutoSize

Output:

diff
NetBIOS  DnsHost  FQDN                          Domain
-------  -------  ----                          ------
WEB01    web01    web01.corp.example.com        corp.example.com
WEB02    web02    web02.corp.example.com        corp.example.com
DB01     db01     db01.corp.example.com         corp.example.com
BUILD01  build01  build01.corp.example.com      corp.example.com

Cross-reference DNS records against actual hostnames

If hostname on 10.0.0.5 reports something different from the PTR record, DNS is stale or the machine was renamed without ipconfig /registerdns.

powershell
$ip = '10.0.0.5'
$ptr = (Resolve-DnsName $ip -ErrorAction SilentlyContinue).NameHost
$real = Invoke-Command -ComputerName $ip -ScriptBlock { hostname }
"PTR: $ptr  ACTUAL: $real"

Output:

makefile
PTR: oldname.corp.example.com  ACTUAL: BUILDSERVER01

Rename a machine and join it to a domain in one step

Add-Computer accepts a -NewName parameter — useful when provisioning a freshly imaged box. The reboot completes both operations atomically.

powershell
$cred = Get-Credential CORP\domainadmin
Add-Computer -DomainName corp.example.com -NewName 'WEB-NEW01' -Credential $cred -Restart

Output:

vbnet
WARNING: The changes will take effect after you restart the computer.

Branch a deployment script on machine role suffix

A common provisioning pattern bakes role into the hostname (WEB01, DB01, BUILD01). Branch logic on the first three characters of %COMPUTERNAME%.

cmd
@echo off
set ROLE=%COMPUTERNAME:~0,3%
if /i "%ROLE%"=="WEB" (
    echo Installing web role
) else if /i "%ROLE%"=="DB-" (
    echo Installing database role
) else (
    echo Unknown role for %COMPUTERNAME%
)

Output:

code
Installing web role
ToolPurpose
systeminfoFull system inventory — Host Name field
whoamiCurrent user and domain — companion identity command
ipconfig /allHost Name and Primary Dns Suffix lines
nslookup <ip>Reverse DNS lookup for other machines
Rename-ComputerModern PowerShell rename
netdom renamecomputerLegacy CMD rename (Server)
Get-CimInstance Win32_ComputerSystemWMI hostname + domain info

Sources

  • hostname — Microsoft Learn