Site icon Gioxx.org

PowerShell: aggiungere o rimuovere indirizzi dal file HOSTS di Windows

You’ve got your work cut out for you.

Photo by Hans-Peter Gauster on Unsplash

Mi è servito diverso tempo fa (per lanciare un’operazione remota tramite Quest Kace), avevo buttato giù qualche riga e poi abbandonato completamente l’articolo. Lo riprendo perché potrebbe sempre servire a qualcuno e nel frattempo posso anche parlarti della possibilità di agire tramite PowerToys (che lo sai che ci sono affezionato 😁). Lo scopo è chiaro: permettere la modifica del file HOSTS di Windows che sia quello locale o remoto, per aggiungere o rimuovere delle voci secondo esigenza.

Non volendo partire da zero ho sbirciato in giro e trovato un codice Gist di circa 12 anni fa ancora funzionante, è lo stesso suggerito anche in una discussione su Stack Overflow e in effetti si spiega solo leggendolo:

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

Il funzionamento è quindi scatenato dallo script PowerShell che accetterà parametri di add (default) o remove, seguito a ruota da IP e hostname che si vuole memorizzare all’interno del file HOSTS del sistema per forzare una risoluzione senza passare dai DNS veri e propri, utile per ambienti di test o per modificare rapidamente un puntamento in attesa che il DNS faccia il suo lavoro magari dopo un aggiornamento e il necessario tempo tecnico di propagazione.
Limitazione unica dello script è l’incapacità di gestire le righe che portano al loro interno un commento, azione che talvolta si fa senza pensarci (IP Hostname #Commento che serve a ricordarsi a cosa serviva quella voce e perché era stata messa a sistema).

Lo script dovrà essere lanciato ovviamente come amministratore locale della macchina (almeno) perché altrimenti non sarebbe possibile salvare le modifiche al file HOSTS di Windows.

L’alternativa firmata Microsoft PowerToys

Si chiama molto banalmente “Hosts File Editor utility” ed è stata realizzata da un connazionale, pubblicata su GitHub e messa a disposizione di ogni utilizzatore di Microsoft PowerToys, la suite di strumenti aggiuntivi per Microsoft Windows che adoro e utilizzo quotidianamente.

Rende l’operazione decisamente semplice anche a chi non ha assolutamente idea di quale file andare a modificare sul sistema e/o non conosce il modo ideale per dichiarare la singola entry all’interno del medesimo.

Due modi di arrivare al medesimo risultato (che diventano tre se includiamo nell’elenco il più tradizionale, Blocco Note e modifica manuale del file HOSTS), a te la scelta. Io in caso di dubbi sono a tua disposizione nell’area commenti :-)

#StaySafe

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti:
Exit mobile version