2010-04-08 5 views
27

Ich schaue, ob ich Powershell-Skript erstellen kann, um den Inhalt in der Host-Datei zu aktualisieren.Powershell zum Bearbeiten der Host-Datei

Jeder weiß, ob es Beispiele gibt, die die Host-Datei mit Powershell oder anderen Scripting LANaguages ​​manipulieren?

Danke.

+0

nur an die Datei anhängen (schreiben, es haben Sie ausreichende Berechtigungen) sollte den Trick tun. – ChristopheD

Antwort

26

Erstens, wenn Sie auf Vista oder Windows 7 sind sicher, dass Sie diese Befehle von einer erhöhten Aufforderung:

# Uncomment lines with localhost on them: 
$hostsPath = "$env:windir\System32\drivers\etc\hosts" 
$hosts = get-content $hostsPath 
$hosts = $hosts | Foreach {if ($_ -match '^\s*#\s*(.*?\d{1,3}.*?localhost.*)') 
          {$matches[1]} else {$_}} 
$hosts | Out-File $hostsPath -enc ascii 

# Comment lines with localhost on them: 
$hosts = get-content $hostsPath 
$hosts | Foreach {if ($_ -match '^\s*([^#].*?\d{1,3}.*?localhost.*)') 
        {"# " + $matches[1]} else {$_}} | 
     Out-File $hostsPath -enc ascii 

diese Gegeben Ich denke, man kann sehen, wie einen regulären Ausdruck verwenden, um Einträge zu manipulieren als notwendig.

+0

Uncommentting funktioniert gut, aber kommentiert nur die [richtige] Ausgabe in der Konsole, ich führe das Skript als Administrator, etwas fehlt? – veritas

+0

@veritas Ich vermute, dass es ein Problem mit dem Regex-Muster gibt. Ist das besser? ''^\ S * ([^ #]. +? \ D {1,3}. *? Localhost. *) '' –

+0

Ich habe festgestellt, dass die Variable '$ hosts 'nach' foreach nicht aktualisiert wurde 'und pipelined einfach alle Ausgaben nach foreach zu der Datei:' $ hosts | foreach {...} | Out-File $ hostsPath -enc ascii' und es funktioniert. – veritas

2

Ich habe einen Code geschrieben, um Einträge vom Host zu löschen. Sie können den Code leicht ändern, um ihm Einträge aus dem Code hinzuzufügen.

$domainName = "www.abc.com" 
$rplaceStr = "" 
$rHost = "C:\Windows\System32\drivers\etc\hosts" 
$items = Get-Content $rHost | Select-String $domainName 
Write-host $items 
foreach($item in $items) 
{ 
(Get-Content $rHost) -replace $item, $rplaceStr| Set-Content $rHost 
} 

Weitere Informationen finden Sie http://nisanthkv.blog.com/2012/06/13/remove-host-entries-using-powershell/

+0

Sie müssen nicht HTML verwenden, um Code einzufügen, sondern nur Ihren Code mit 4 Leerzeichen einzurücken. – Dhara

17

Die Carbon module eine Set-HostsEntry Funktion hat einen hosts-Eintrag für die Einstellung:

Set-HostsEntry -IPAddress 10.2.3.4 -HostName 'myserver' -Description "myserver's IP address" 
0

Für mich die größten Schmerzen im Zusammenhang mit der Hosts-Datei im Umgang erinnert mich, wo es ist. Ich setze eine Variable, die auf meine hosts-Datei in meinem PowerShell-Profil verweist, was es einfach macht, sie in einem Texteditor zu bearbeiten.

In Powershell, geben Sie Folgendes Ihr Profil zu öffnen:

C:\> Notepad $profile 

hinzufügen:

$hosts = "$env:windir\System32\drivers\etc\hosts" 

Speichern Sie die Datei, dann schließen und wieder öffnen Powershell, als Administrator ausgeführt. Sie können die Hosts-Datei nicht ohne erhöhte Berechtigungen bearbeiten.

Jetzt können Sie diese bearbeiten Sie Ihre Hosts die gleiche Art und Weise Datei, die Sie Ihr Profil bearbeiten würden:

C:\> Notepad $hosts 
17

Wenn jemand für ein fortgeschritteneren Beispiel suchen, habe ich schon immer besonders gern diesen Kern: https://gist.github.com/markembling/173887

# 
# 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" 
} 
+0

Probleme mit temporärem Zugriff auf Datei (locked). bemerke, wenn ich es zweimal führe, ist es oft mal frei. Es könnte gut sein, Save Out-Datei in eine Wiederholung zu übertragen. – sonjz

4

Beginnend mit Kevin Remisoski ausgezeichneter Antwort oben, kam ich mit diesem nach oben, die mich auf einmal mehrere Einträge hinzufügen/aktualisieren kann. Ich habe auch die Regex im Split geändert, um nach jedem Leerzeichen zu suchen, nicht nur nach Tab.

function setHostEntries([hashtable] $entries) { 
    $hostsFile = "$env:windir\System32\drivers\etc\hosts" 
    $newLines = @() 

    $c = Get-Content -Path $hostsFile 
    foreach ($line in $c) { 
     $bits = [regex]::Split($line, "\s+") 
     if ($bits.count -eq 2) { 
      $match = $NULL 
      ForEach($entry in $entries.GetEnumerator()) { 
       if($bits[1] -eq $entry.Key) { 
        $newLines += ($entry.Value + '  ' + $entry.Key) 
        Write-Host Replacing HOSTS entry for $entry.Key 
        $match = $entry.Key 
        break 
       } 
      } 
      if($match -eq $NULL) { 
       $newLines += $line 
      } else { 
       $entries.Remove($match) 
      } 
     } else { 
      $newLines += $line 
     } 
    } 

    foreach($entry in $entries.GetEnumerator()) { 
     Write-Host Adding HOSTS entry for $entry.Key 
     $newLines += $entry.Value + '  ' + $entry.Key 
    } 

    Write-Host Saving $hostsFile 
    Clear-Content $hostsFile 
    foreach ($line in $newLines) { 
     $line | Out-File -encoding ASCII -append $hostsFile 
    } 
} 

$entries = @{ 
    'aaa.foo.local' = "127.0.0.1" 
    'bbb.foo.local' = "127.0.0.1" 
    'ccc.foo.local' = "127.0.0.1" 
}; 
setHostEntries($entries) 
+0

schön;) Ich muss damit herumspielen, dachte in letzter Zeit, ich habe keine wampartigen Umgebungen benutzt. Nun, eigentlich bin ich einfach migriert. Ich habe eine Dual-Boot-Maschine, aber da ich wegen meiner anderen Bedürfnisse oft in Windows steckengeblieben bin, habe ich beschlossen, Bash für Windows zu installieren (basierend auf Ubuntu) und man hat viel weniger Schmerzen in der Arsch-Situation Dies betrifft die Migration von einer lokalen Windows-Umgebung zu einer Linux-Dev- oder Live-Version. –

Verwandte Themen