ContainerHandling/updatehosts.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Param(
    [string]$hostsFile = "c:\windows\system32\drivers\etc\hosts",
    [string]$hostname = "localhost",
    [string]$ipAddress = "127.0.0.1"
)

new-item -Path $hostsFile -ItemType File -ErrorAction Ignore | Out-Null
$file = $null
try {
    while (!($file)) {
        try {
            $file = [System.IO.File]::Open($hostsFile, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::Read)
        } catch [SYstem.IO.IOException]  {
            Start-Sleep -Seconds 1
        }
    }

    $content = New-Object System.Byte[] ($file.Length)
    $file.Read($content, 0, $file.Length) | Out-Null
    [System.Collections.ArrayList]$hosts = ([System.Text.Encoding]::ASCII.GetString($content)).Replace("`r`n","`n").Split("`n")

    $hostname = $hostname.ToLowerInvariant()
    $ln = 0
    while ($ln -lt $hosts.Count) {
        $line = $hosts[$ln]
        $idx = $line.IndexOf("#")
        if ($idx -ge 0) {
            $line = $line.Substring(0,$idx)
        }
        $hidx = ("$line ".Replace("`t"," ")).ToLowerInvariant().IndexOf(" $hostName ")
        if ($hidx -ge 0 -or $line -eq "") {
            $hosts.RemoveAt($ln) | Out-Null
        } else {
            $ln++
        }
    }
    if ("$ipAddress" -ne "") {
        $hosts.Add("$ipAddress $hostName") | Out-Null
    }

    $content = [System.Text.Encoding]::ASCII.GetBytes($($hosts -join [Environment]::NewLine)+[Environment]::NewLine)

    $file.Seek(0, [System.IO.SeekOrigin]::Begin) | Out-Null
    $file.Write($content, 0, $content.Length)
    $file.SetLength($content.Length)
    $file.Flush()

} finally {
    if ($file) {
        $file.Dispose()
    }
}