2010-04-08 20 views
27

Estoy buscando para ver si puedo crear script powershell para actualizar los contenidos en el archivo host.Powershell para manipular el archivo host

¿Alguien sabe si hay algún ejemplo que manipule el archivo de host con powershell o cualquier otro lenguaje de scripting?

Gracias.

+0

solo anexar al archivo (escribirle, si tiene suficientes permisos) debería hacer el truco. – ChristopheD

Respuesta

26

En primer lugar, si se encuentra en Vista o Windows 7 asegúrese de ejecutar estos comandos desde un símbolo del sistema elevado:

# 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 

Teniendo en cuenta esto, creo que se puede ver cómo utilizar una expresión regular para manipular entradas como necesario.

+0

Descomponer está funcionando bien, pero los comentarios solo imprimen el resultado [apropiado] en la consola, estoy ejecutando el script como administrador, ¿falta algo? – veritas

+0

@veritas Sospecho que hay un problema con el patrón de expresiones regulares. ¿Esto es mejor ''^ \ s * ([^ #]. +? \ D {1,3}. *? Localhost. *)' ' –

+0

Encontré que la variable' $ hosts' no se actualizó después de 'foreach 'y simplemente canalizó todo el resultado después de foreach al archivo:' $ hosts | foreach {...} | Out-File $ hostsPath -enc ascii' y funciona. – veritas

2

He escrito un código para eliminar entradas del host. Puede cambiar fácilmente el código para agregarle entradas desde el código.

$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 
} 

Para obtener más información, véase http://nisanthkv.blog.com/2012/06/13/remove-host-entries-using-powershell/

+0

No necesita usar html para insertar código, simplemente sangría su código con 4 espacios. – Dhara

17

El Carbon module tiene una función Set-HostsEntry para establecer una entrada de los ejércitos:

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

Para mí el mayor dolor en el trato con el archivo de hosts es recordar donde es. Establecí una variable que apunta a mi archivo de hosts en mi perfil de PowerShell, lo que hace que sea fácil de editar en un editor de texto.

En PowerShell, escriba lo siguiente para abrir su perfil:

C:\> Notepad $profile 

añadir lo siguiente:

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

Guardar el archivo, a continuación, cierre y vuelva a abrir PowerShell, ejecutar como administrador. No puede editar el archivo de hosts sin permisos elevados.

Ahora se puede editar el archivo HOSTS de la misma manera deberá modificar su perfil:

C:\> Notepad $hosts 
17

Si alguien está buscando un ejemplo más avanzado, siempre he sido particularmente aficionado a este GIST: 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

teniendo problemas con el acceso temporal al archivo (bloqueado). Observe si lo ejecuto dos veces, a menudo se libera. podría ser bueno para envolver guardar fuera de archivo en un reintento. – sonjz

4

Comenzando con una excelente respuesta de Kevin Remisoski anterior, se me ocurrió esto lo que me permite añadir/actualizar varias entradas a la vez. También cambié la expresión regular en la división para buscar cualquier espacio en blanco, no solo 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

nice;) Tendré que jugar con eso, pensé que últimamente no he usado entornos tipo wamp. Bueno, en realidad acabo de migrar. Tengo una máquina de arranque dual, pero dado que estoy atascado en Windows la mayor parte del tiempo debido a mis otras necesidades, decidí instalar bash para Windows (basado en Ubuntu) y para el hombre, cuánto menos dolor en la situación del culo cuando Pertenece a la migración de un entorno Windows Local Dev a una versión Linux Dev o Live. –

Cuestiones relacionadas