Powershell to manipulate host file

后端 未结 9 1704
我在风中等你
我在风中等你 2021-01-30 02:32

I am looking at to see if I can create powershell script to update the contents in the host file.

Anybody know if there are any examples that manipulate the host file u

相关标签:
9条回答
  • 2021-01-30 02:41

    I have written a code to delete entries from host. You can easily change the code to add entries to it from the code.

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

    For more information see http://nisanthkv.blog.com/2012/06/13/remove-host-entries-using-powershell/

    0 讨论(0)
  • 2021-01-30 02:43

    If anyone is looking for a more advanced example, I've always been particularly fond of this 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 讨论(0)
  • 2021-01-30 02:43

    99% of the time admin rights are needed to modify a host record. Try adding this code at the top of your Powershell script.

    If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))
    
    {   
    $arguments = "& '" + $myinvocation.mycommand.definition + "'"
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    Break
    }
    
    0 讨论(0)
  • 2021-01-30 02:44

    First up, if you're on Vista or Windows 7 make sure you run these commands from an elevated prompt:

    # 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
    

    Given this I think you can see how to use a regex to manipulate entries as necessary.

    0 讨论(0)
  • 2021-01-30 02:50

    All of these answers are pretty elaborate. This is all you need to add a hosts file entry:

    Add-Content -Path C:\Windows\System32\drivers\etc\hosts -Value "127.0.0.1`tlocalhost" -Force
    

    IP address and hostname are separated by `t which is the powershell notation for a tab character.

    0 讨论(0)
  • 2021-01-30 02:52

    The Carbon module has a Set-HostsEntry function for setting a hosts entry:

    Set-HostsEntry -IPAddress 10.2.3.4 -HostName 'myserver' -Description "myserver's IP address"
    
    0 讨论(0)
提交回复
热议问题