Remove-GCHostsFileEntry.ps1

<#
.SYNOPSIS
  Remove a hosts file entry from the hosts file.
.DESCRIPTION
  Unlike the other hosts file cmdlets, this function is a
  simple line match and remove.
 
  Type 'Get-Help Remove-GCHostsFileEntry -Online' for extra information.
.PARAMETER Target
  The search string to remove from the hosts file.
  Regular expressions are supported.
.EXAMPLE
  The following example removes any lines in the hosts file
  that match the target string:
 
  Remove-GCHostFileEntry -Target "abc.net.au"
.EXAMPLE
  The following example will remove all empty lines from
  the hosts file:
 
  Remove-GCHostsFileEntry -Target '^$'
#>

function Remove-GCHostsFileEntry {
  [CmdletBinding(HelpUri = 'https://github.com/grantcarthew/GCPowerShell')]
  [OutputType([Int])]
  Param (
    [Parameter(Mandatory=$true,
               Position=0,
               ValueFromPipeline=$false)]
    [ValidateNotNullOrEmpty()]
    [String[]]
    $Target
  )
  
  Write-Verbose -Message "Function initiated: $($MyInvocation.MyCommand)"
  Import-Module -Name GCTest
  
  $hostsFilePath = Join-Path -Path $env:SystemRoot -ChildPath '\System32\drivers\etc\hosts'
  Write-Verbose -Message "Hosts file path set to: $hostsFilePath"

  if (-not (Test-GCFileWrite -Path $hostsFilePath)) {
    Write-Error -Message "Can't write to the hosts file. Check it exists and you have write permissions."
  }

  Write-Verbose -Message "Getting content from hosts file."
  $lines = Get-Content -Path $hostsFilePath
  $output = New-Object -TypeName System.Collections.ArrayList

  if ($lines.length -lt 1) {
    Write-Output -InputObject "Hosts file is empty. No change."
    Exit
  } else {
    Write-Verbose -Message "Cleaning Target from hosts: $Target"
    foreach ($line in $lines) {
      if ($line -notmatch $Target) {
        $output.Add($line) | Out-Null
      }
    }
  }

  if ($output.Count -lt 1) {
    Write-Verbose -Message "Nothing to write to the hosts file. No change."
  } else {
    Write-Verbose -Message "Writing new hosts file"
    Set-Content -Path $hostsFilePath -Value $output -Force
  }
  Write-Verbose -Message "Total lines before : $($lines.Length)"
  Write-Verbose -Message "Total lines after : $($output.Count)"
  Write-Verbose -Message "Total lines removed: $($lines.Length - $output.Count)"
  Write-Verbose -Message "Function completed: $($MyInvocation.MyCommand)"
}