As a web developer you often have to use a host file, this script helps assist a safe and fast change with little effort.
#
# Powershell script for adding/removing/showing entries to the hosts file.
#
# Known limitations:
# - does not handle entries with comments afterwards ("<ip> <host> # comment")
#
# Original Script: https://gist.github.com/markembling/173887/1824b370be3fe468faceaed5f39b12bad010a417
# Modified Script: https://gist.github.com/andreymir/405b924d32dace51af2b
# Modified Script: https://gist.github.com/lantrix/052dff5737957aae4e25
#
<#
.SYNOPSIS
Powershell script for modifying entries in the hosts file.
.PARAMETER Action
The action you would like to perform (add, remove, show)
.PARAMETER HostsFile
The hosts file to modify
.PARAMETER IP
The IP address for the hosts entry
.PARAMETER Hostname
The hostname for the entry
.EXAMPLE
.\hosts.ps1 -Action add -HostsFile "C:\Windows\System32\drivers\etc\hosts" -IP "127.0.0.1" -Hostname "myserverhost"
.EXAMPLE
.\hosts.ps1 add "dkittell.local" "127.0.0.1" "C:\Windows\System32\drivers\etc\hosts"
.EXAMPLE
.\hosts.ps1 add "dkittell.local" "127.0.0.1"
.EXAMPLE
.\hosts.ps1 -Action remove -HostsFile "C:\Windows\System32\drivers\etc\hosts" -Hostname "myserverhost"
.EXAMPLE
.\hosts.ps1 remove "dkittell.local"
.EXAMPLE
.\hosts.ps1 -Action show -HostsFile "C:\Windows\System32\drivers\etc\hosts"
.EXAMPLE
.\hosts.ps1 show 'C:\WINDOWS\System32\drivers\etc\hosts'
.EXAMPLE
.\hosts.ps1 show
#>
param
(
[Parameter(Mandatory = $true,Position = 0)]
[ValidateSet("add","remove","show")]
[string]$Action,
[Parameter(Position = 1)]
[string]$Hostname,
[Parameter(Position = 2)]
[System.Net.IPAddress]$IP,
[Parameter(Position = 3)]
[string]$HostsFile = "$env:SystemRoot" + "\System32\drivers\etc\hosts"
)
#region Functions
function add-host {
<#
.SYNOPSIS
Powershell function for adding entries to the hosts file.
.PARAMETER HostsFile
The hosts file to modify
.PARAMETER IP
The IP address for the hosts entry
.PARAMETER Hostname
The hostname for the entry
.EXAMPLE
Add-Host -HostsFile "C:\Windows\System32\drivers\etc\hosts" -IP "127.0.0.1" -Hostname "myserverhost"
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)] [string]$HostsFile,
[Parameter(Mandatory = $true)] [string]$IP,
[Parameter(Mandatory = $true)] [string]$Hostname
)
remove-host -HostsFile $HostsFile -hostname $Hostname
$IP + "`t`t" + $Hostname | Out-File -Encoding ASCII -Append $HostsFile
}
function remove-host {
<#
.SYNOPSIS
Powershell function for removing entries from a hosts file.
.DESCRIPTION
Known limitations: does not handle entries with comments afterwards ("<ip> <host> # comment")
.PARAMETER HostsFile
The hosts file to modify
.PARAMETER Hostname
The hostname for the entry
.EXAMPLE
Remove-Host -HostsFile "C:\Windows\System32\drivers\etc\hosts" -Hostname "myserverhost"
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)] [string]$HostsFile,
[Parameter(Mandatory = $true)] [string]$Hostname
)
$c = Get-Content $HostsFile
$newLines = @()
foreach ($line in $c) {
$bits = [regex]::Split($line,'\t+')
if ($bits.count -eq 2) {
if ($bits[1] -ne $Hostname) {
$newLines += $line
}
} else {
$newLines += $line
}
}
# Write file
Clear-Content $HostsFile
foreach ($line in $newLines) {
$line | Out-File -Encoding ASCII -Append $HostsFile
}
}
function Show-Hosts {
<#
.SYNOPSIS
Powershell function for showing entries in a hosts file.
.DESCRIPTION
Known limitations: does not handle entries with comments afterwards ("<ip> <host> # comment")
.PARAMETER HostsFile
The hosts file to access
.EXAMPLE
Show-Hosts -HostsFile "C:\Windows\System32\drivers\etc\hosts"
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)] [string]$HostsFile
)
$c = Get-Content $HostsFile
foreach ($line in $c) {
$bits = [regex]::Split($line,'\t+')
if ($bits.count -eq 2) {
Write-Host $bits[0] `t`t $bits[1]
}
}
}
#endregion Functions
#region Take Action
try {
if ($Action -eq "add") {
if ($IP -eq '' -or $Hostname -eq '') {
throw "Not enough arguments for add."
} else {
add-host -HostsFile $HostsFile -ip $IP -hostname $Hostname
Show-Hosts -HostsFile $HostsFile
}
} elseif ($Action -eq "remove") {
if ($Hostname -eq '') {
throw "Not enough arguments for remove."
} else {
remove-host $HostsFile $Hostname
Show-Hosts -HostsFile $HostsFile
}
} elseif ($Action -eq "show") {
Show-Hosts -HostsFile $HostsFile
} else {
throw "Invalid operation '" + $Action + "' - must be one of 'add', 'remove', 'show'."
}
} catch {
Write-Host $error[0]
Write-Host "`nUsage: hosts add <ip> <hostname>`n hosts remove <hostname>`n hosts show"
}
#endregion Take Action
<#
.EXAMPLE
.\hosts.ps1 -Action add -HostsFile "C:\Windows\System32\drivers\etc\hosts" -IP "127.0.0.1" -Hostname "myserverhost"
.EXAMPLE
.\hosts.ps1 add "dkittell.local" "127.0.0.1" "C:\Windows\System32\drivers\etc\hosts"
.EXAMPLE
.\hosts.ps1 add "dkittell.local" "127.0.0.1"
.EXAMPLE
.\hosts.ps1 -Action remove -HostsFile "C:\Windows\System32\drivers\etc\hosts" -Hostname "myserverhost"
.EXAMPLE
.\hosts.ps1 remove "dkittell.local"
.EXAMPLE
.\hosts.ps1 -Action show -HostsFile "C:\Windows\System32\drivers\etc\hosts"
.EXAMPLE
.\hosts.ps1 show 'C:\WINDOWS\System32\drivers\etc\hosts'
.EXAMPLE
.\hosts.ps1 show
#>
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.