PowerShell – Compare Windows Server Host Files

| | | |

If you maintain more than one Windows server sometimes you need a quick way to determine the host file differences on each server, the code below will help.

function Read-HostFile() {
	[CmdletBinding()]
	Param(
		[Parameter(Mandatory = $True)]
		[String] $Computer,
		[boolean] $ListComputerName = $true
	)
	$Pattern = '^(?<IP>\d{1,3}(\.\d{1,3}){3})\s+(?<Host>.+)$'
	$File = "\\$Computer\c$\Windows\System32\Drivers\etc\hosts"
	$Entries = @()
	(Get-Content -Path $File) | ForEach-Object {    
		If ($_ -match $Pattern) {   
			if ($ListComputerName) {     
				$Entries += "$Computer,$($Matches.IP),$($Matches.Host)"
			}
			else {
				$Entries += "$($Matches.IP),$($Matches.Host)"
			}
		}
	}
	$Entries
}

function Compare-HostFiles() {
	[CmdletBinding()]
	Param(
		[Parameter(Mandatory = $True)]
		[String] $Computer1,
		[Parameter(Mandatory = $True)]
		[String] $Computer2
	)
	Write-Output "Comparing host file from $($Computer1.ToLower()) to $($Computer2.ToLower())"
	Compare-Object `
		-ReferenceObject $(Read-HostFile `
			-Computer $Computer1 `
			-ListComputerName $false) `
		-DifferenceObject $(Read-HostFile `
			-Computer $Computer2 `
			-ListComputerName $false) `
		-IncludeEqual | 
	Format-Table `
		-AutoSize `
	@{Label = "Host Entry"; Expression = { $_.InputObject } },
	@{Label = "Comparison"; Expression = { $_.SideIndicator } }
}
Clear-Host

# Compare Servers
Compare-HostFiles -Computer1 dev-webserver-p01 -Computer2 dev-webserver-p02

# Read individual files
Read-HostFile 'dev-webserver-p01'
Read-HostFile 'dev-webserver-p02'
All information on this site is shared with the intention to help. Before any source code or program is ran on a production (non-development) system it is suggested you test it and fully understand what it is doing not just what it appears it is doing. I accept no responsibility for any damage you may do with this code.