Created
August 24, 2009 13:38
-
-
Save markembling/173887 to your computer and use it in GitHub Desktop.
Powershell script for adding/removing/viewing entries to the hosts file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# Powershell script for adding/removing/showing entries to the hosts file. | |
# | |
# Known limitations: | |
# - does not handle entries with comments afterwards ("<ip> <host> # comment") | |
# | |
$file = "C:\Windows\System32\drivers\etc\hosts" | |
function add-host([string]$filename, [string]$ip, [string]$hostname) { | |
remove-host $filename $hostname | |
$ip + "`t`t" + $hostname | Out-File -encoding ASCII -append $filename | |
} | |
function remove-host([string]$filename, [string]$hostname) { | |
$c = Get-Content $filename | |
$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 $filename | |
foreach ($line in $newLines) { | |
$line | Out-File -encoding ASCII -append $filename | |
} | |
} | |
function print-hosts([string]$filename) { | |
$c = Get-Content $filename | |
foreach ($line in $c) { | |
$bits = [regex]::Split($line, "\t+") | |
if ($bits.count -eq 2) { | |
Write-Host $bits[0] `t`t $bits[1] | |
} | |
} | |
} | |
try { | |
if ($args[0] -eq "add") { | |
if ($args.count -lt 3) { | |
throw "Not enough arguments for add." | |
} else { | |
add-host $file $args[1] $args[2] | |
} | |
} elseif ($args[0] -eq "remove") { | |
if ($args.count -lt 2) { | |
throw "Not enough arguments for remove." | |
} else { | |
remove-host $file $args[1] | |
} | |
} elseif ($args[0] -eq "show") { | |
print-hosts $file | |
} else { | |
throw "Invalid operation '" + $args[0] + "' - 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" | |
} |
Thanks, in my usage doing an add or remove was removing all data. if doing an add the hosts file would be blank except for the added item, if doing a remove all items will be removed. As the first comment states, editing this section of the script to remove the n after hostname, resolved the issue.
} catch {
Write-Host $error[0]
Write-Host "nUsage: hosts add <ip> <hostname>
n hosts remove `n hosts show"
}
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'm not sure what you mean @tylercorelitz.
The entire contents of the file get replaced but that's inevitable for the remove operation. It needs to essentially read the current contents of the file and then replace it with what was there before but without the line which is to be removed. So yes, the entire file is rewritten but the new contents should be whatever was there before except for the removed entry.
When you do an add, it will attempt a removal of the hostname you're adding to avoid the possibility of it having been added twice.