(NOTE: See also some third-party Hosts managers, listed below.)
+### For older versions of Windows
+
On Linux and macOS, run the Python script. On Windows more work is required due
to compatibility issues so it's preferable to run the batch file as follows:
- **Windows 10**: Start Button → type `cmd` → right-click Command Prompt → "Run
as Administrator"
+### For new versions of Windows
+
+On modern versions of Windows (10 and especially 11) not all features of the
+aforementioned batch script work (specifically checking if the current shell has
+administrative priviliges) and therefore a more modern approach is recommended.
+
+The provided `updateHostsWindows.ps1` is a Powershell 5.1 script that does the
+same thing as the batch script, but without the need for the python script, with
+added options, and uses only built-in commands (self-contained). As with the
+batch file it **MUST** be ran with administrative privildges, but it can
+relaunch itself if not.
+
+To run execute the script type:
+```Powershell
+.\updateHostsWindows.ps1
+```
+into any available Windows command line and for detailed information type:
+```Powershell
+Get-Help .\updateHostsWindows.ps1 -Full
+```
+
+Newer Windows comes with several issues (that can be overcome) and for more
+information and solutions please visit the home of this script [here](https://github.com/Lateralus138/updateHostsWindows-stevenblack).
+
+---
+
You can also refer to the "Third-Party Hosts Managers" section for further
recommended solutions from third parties.
--- /dev/null
+<#
+ .SYNOPSIS
+ Install/update hosts files found at https://github.com/StevenBlack/hosts/.
+ .DESCRIPTION
+ Install/update consolidated hosts files found at
+ https://github.com/StevenBlack/hosts/.
+ .PARAMETER Alternate
+ Update hosts with one of the alternate hosts file found in Steven's alternates
+ directory.
+ .PARAMETER OutFile
+ Download the file only, do not update. Defaults to the current path.
+ .PARAMETER NoBackup
+ Do not create a backup file.
+ .PARAMETER Force
+ Force continue the script on errors.
+ .PARAMETER Restore
+ Restore the hosts file with the current skeleton backup if one exists and
+ exits.
+ .EXAMPLE
+ PS> .\updateHostsWindows.ps1
+ .EXAMPLE
+ PS> .\updateHostsWindows.ps1 -OutFile '.\hosts'
+ --------------------------------------------------------------------------------
+ This Powershell script updates the Windows hosts file from one of the various consolidated hosts files found at at: https://github.com/StevenBlack/hosts -------------------------------------------------------------------------------- If updating the hosts file fails due to the hosts file being in use then it's best to just keep trying. It's not always in use though it is hard to figure
+ out when it's free so it's recommended to use while loop on $LASTEXITCODE to
+ keep trying. E.G.: while ($LASTEXITCODE -gt 0) { .\updateHostsWindows.ps1 }.
+ --------------------------------------------------------------------------------
+ Use: Get-Help .\updateHostsWindows.ps1 -Detailed (or -Full) for more
+ information.
+ --------------------------------------------------------------------------------
+
+ Checking if we are in a shell with administrative privileges.
+ Attempting to get data from
+ https://raw.githubusercontent.com/StevenBlack/hosts/refs/heads/master/hosts.
+ Attempting to create output file .\hosts.
+ Successfully created file: .\hosts.
+#>
+<#
+╔════════════════════════════════════════════════════════════════════════╗
+║ This Powershell script updates the Windows hosts file from one of the ║
+║ various consolidated hosts files found at at: ║
+║ https://github.com/StevenBlack/hosts ║
+║ This script is written for backwards compatibility for Powershell 5.1+ ║
+║ as PowerCore is not installed by default. ║
+║ ║
+║ Original script written by: ║
+║ Ian Pride (Lateralus138) ║
+║ faithnomoread@yahoo.com ║
+╚════════════════════════════════════════════════════════════════════════╝
+#>
+<#
+╔═══════════════════╗
+║ Parse parameters. ║
+╚═══════════════════╝
+#>
+Param(
+ [String]$Alternate,
+ [String]$OutFile,
+ [Switch]$NoBackup,
+ [Switch]$Force,
+ [Switch]$Restore
+)
+<#
+╔═══════════════════╗
+║ Global variables. ║
+╚═══════════════════╝
+#>
+$seperator = '-' * 80
+$baseHostsUrl = 'https://raw.githubusercontent.com/StevenBlack/hosts/refs/heads/master/'
+$WriteStatus = {
+ Param(
+ [ValidateScript({ $_.Length -gt 0 })][String]$Message,
+ [Switch]$IsError
+ )
+ switch ($IsError){
+ $true { $color = 'Red' }
+ default { $color = 'Green' }
+ }
+ $lastColor = $host.ui.RawUI.ForegroundColor
+ $host.ui.RawUI.ForegroundColor = $color
+ $Message
+ $host.ui.RawUI.ForegroundColor = $lastColor
+}
+<#
+╔════════════════════╗
+║ About this script. ║
+╚════════════════════╝
+#>
+@"
+
+ $seperator
+ This Powershell script updates the Windows hosts file from one of the various
+ consolidated hosts files found at at: https://github.com/StevenBlack/hosts
+ $seperator
+ If updating the hosts file fails due to the hosts file being in use then it's
+ best to just keep trying. It's not always in use though it is hard to figure
+ out when it's free so it's recommended to use while loop on `$LASTEXITCODE to
+ keep trying. E.G.: while (`$LASTEXITCODE -gt 0) { .\updateHostsWindows.ps1 }.
+ $seperator
+ Use: Get-Help .\updateHostsWindows.ps1 -Detailed (or -Full) for more
+ information.
+ $seperator
+
+"@
+<#
+╔═════════════════════════════════╗
+║ Check administrative privileges ║
+╚═════════════════════════════════╝
+#>
+' Checking if we are in a shell with administrative privileges.'
+if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
+ [Security.Principal.WindowsBuiltInRole] "Administrator")) {
+
+$argString = ''
+$PSBoundParameters.GetEnumerator() | Foreach-Object {
+ $argString += ' -' + $_.Key + ' ' + $_.Value
+}
+ ' Attempting to restart this script as administrator.'
+ try {
+ Start-Process powershell `
+ -ArgumentList "-NoLogo -NoExit -NoProfile -Command `"Set-Location $PWD`; $PSCommandPath $argString`"" `
+ -Verb RunAs `
+ -ErrorAction SilentlyContinue
+ } catch {
+ &$WriteStatus $(" " + $_.Exception.Message + "`n") -IsError
+ }
+ exit 1
+}
+if ($Alternate -eq 'True') { $Alternate = '' }
+if ($OutFile -eq 'True') { $OutFile = '' }
+$hostsFile = $Env:SystemRoot + '\System32\drivers\etc\hosts'
+$hostsSkeleton = $hostsFile + '.skel'
+<#
+╔══════════════════════╗
+║ Restore last backup. ║
+╚══════════════════════╝
+#>
+if ($Restore){
+ Write-Host " Attempting to restore $hostsSkeleton"
+ if (-not (Test-Path -Path $hostsSkeleton -PathType Leaf )) {
+ &$WriteStatus $(' ' + $hostsSkeleton + " not found.`n") -IsError
+ exit 2
+ }
+ try {
+ Copy-Item -Path $hostsSkeleton -Destination $hostsFile -ErrorAction Stop
+ $successMessage =
+@"
+ Successfully restored $hostsSkeleton to $hostsFile.
+
+"@
+ &$WriteStatus $successMessage
+ } catch {
+ &$WriteStatus $(
+ " Could not restore the hosts file.`n " +
+ $_.InvocationInfo.MyCommand.Name + ': ' + $_.Exception.Message + "`n If the file was in use please try again. It will eventually be free.`n"
+ ) -IsError
+ exit 3
+ }
+ exit 0
+}
+<#
+╔════════════════════════════╗
+║ Backup current hosts file. ║
+╚════════════════════════════╝
+#>
+if (-not ($OutFile)){
+ switch ($NoBackup){
+ $true { " No backup will be created." }
+ default {
+ " Attempting to create a back up of $hostsFile."
+ try {
+ Copy-Item -Path $hostsFile -Destination $hostsSkeleton -ErrorAction Stop
+ $successMessage =
+@"
+ Successfully created a backup of the current hosts file at
+ $hostsSkeleton.
+"@
+ &$WriteStatus $successMessage
+ } catch {
+ &$WriteStatus $(
+ " Could not create a backup of the hosts file.`n " +
+ $_.InvocationInfo.MyCommand.Name + ': ' + $_.Exception.Message
+ ) -IsError
+ if (-not ($Force)) {
+ &$WriteStatus " This script will now exit (use the -Force switch to force continue on error).`n" -IsError
+ exit 4
+ }
+ }
+
+ }
+ }
+}
+<#
+╔══════════════════════════╗
+║ Select which hosts file. ║
+╚══════════════════════════╝
+#>
+switch ($Alternate.Length -gt 0) {
+ $true { $hostsUrl = $baseHostsUrl + 'alternates/' + $Alternate + '/hosts' }
+ default { $hostsUrl = $baseHostsUrl + 'hosts' }
+}
+<#
+╔═════════════════════════════╗
+║ Get remote hosts file data. ║
+╚═════════════════════════════╝
+#>
+try {
+ " Attempting to get data from`n $hostsUrl."
+ $response = Invoke-WebRequest -Uri $hostsUrl
+} catch {
+ &$WriteStatus $(' ' + $_.Exception.Message + "`n") -IsError
+ exit 5
+}
+if (-not($response.StatusDescription -eq 'OK')) {
+ &$WriteStatus $(
+ " Could not retrieve a valid reponse from`n $hostsUrl. [" +
+ $response.StatusCode + '] ' + $response.StatusDescription + "`n"
+ ) -IsError
+ exit 6
+}
+<#
+╔══════════════════════════════════╗
+║ Install, update, or create file. ║
+╚══════════════════════════════════╝
+#>
+if ($OutFile.Length -gt 0){
+ " Attempting to create output file $OutFile."
+ try {
+ $response.Content | Out-File -FilePath $OutFile -Encoding utf8
+ } catch {
+ &$WriteStatus $(
+ " Could not create file: $OutFile.`n " + $_.Exception.Message + "`n"
+ ) -IsError
+ exit 7
+ }
+ &$WriteStatus " Successfully created file: $OutFile.`n"
+ exit 0
+}
+" Attempting to update $hostsFile."
+try {
+ $response.Content | Out-File -FilePath $hostsFile -Encoding utf8
+} catch {
+ &$WriteStatus $(
+ " Could not update: $hostsFile.`n " + $_.Exception.Message + "`n"
+ ) -IsError
+ exit 8
+}
+&$WriteStatus " Successfully updated: $hostsFile.`n"
+<#
+╔═════════════════════════════════════════════════════════════════════════════════╗
+║ If the system hosts file has been installed or update then flush the DNS cache. ║
+╚═════════════════════════════════════════════════════════════════════════════════╝
+#>
+try {
+ " Attempting to flush the DNS cache."
+ ipconfig /flushdns
+} catch {
+ &$WriteStatus $(
+ " Could not flush the DNS cache.`n" + $_.Exception.Message + "`n"
+ ) -IsError
+ exit 9
+}
+&$WriteStatus " Successfully flushed the DNS cache.`n"
+exit 0