Powershell для манипулирования хост-файлом - PullRequest
39 голосов
/ 08 апреля 2010

Я смотрю, могу ли я создать скрипт powershell для обновления содержимого файла хоста.

Кто-нибудь знает, есть ли примеры, которые манипулируют хост-файлом с использованием powershell или любых других скриптовых языков?

Спасибо.

Ответы [ 8 ]

31 голосов
/ 11 апреля 2010

Прежде всего, если вы работаете в Vista или Windows 7, убедитесь, что вы запускаете эти команды из командной строки с повышенными правами:

# 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

Учитывая это, я думаю, вы можете увидеть, как использовать регулярные выражения для манипулирования записями по мере необходимости.

24 голосов
/ 06 июля 2012

Модуль Carbon имеет функцию Set-HostsEntry для установки записи хоста:

Set-HostsEntry -IPAddress 10.2.3.4 -HostName 'myserver' -Description "myserver's IP address"
22 голосов
/ 11 апреля 2015

Если кто-то ищет более продвинутый пример, мне всегда особенно нравилась эта суть: 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"
}
6 голосов
/ 16 марта 2017

Начиная с превосходного ответа Кевина Ремизоски выше, я придумал это, которое позволяет мне добавлять / обновлять несколько записей одновременно. Я также изменил регулярное выражение в разбиении, чтобы искать любые пробелы, а не только табуляцию.

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)
3 голосов
/ 14 июня 2012

Я написал код для удаления записей с хоста. Вы можете легко изменить код, чтобы добавить в него записи из кода.

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

Для получения дополнительной информации см. http://nisanthkv.blog.com/2012/06/13/remove-host-entries-using-powershell/

2 голосов
/ 27 марта 2019

Все эти ответы довольно сложные. Это все, что вам нужно для добавления записи в файл hosts:

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

IP-адрес и имя хоста разделены `t , который является обозначением powershell для символа табуляции.

1 голос
/ 28 января 2015

Для меня самая большая боль в работе с файлом hosts - запоминание, где он находится.Я установил переменную, которая указывает на мой файл hosts, в моем профиле PowerShell, что облегчает редактирование в текстовом редакторе.

В PowerShell введите следующее, чтобы открыть свой профиль:

C:\> Notepad $profile

Добавьте это:

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

Сохраните файл, затем закройте и снова откройте PowerShell, с правами администратора .Вы не можете редактировать файл hosts без повышенных разрешений.

Теперь вы можете редактировать свой хост-файл так же, как и свой профиль:

C:\> Notepad $hosts
0 голосов
/ 05 октября 2018

Я написал быстрый скрипт, который создает простой графический интерфейс для добавления новых записей в файл HOSTS. Он откроет окно, спросит имя хоста и IP, а затем добавит ваш ввод в файл HOSTS.

Я уверен, что это можно упростить и выглядеть чище ... но отлично подходит для моего варианта использования.

Наслаждайтесь!

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$hostsfilelocation = "$env:windir\System32\drivers\etc\hosts"
$readhostsfile = Get-Content $hostsfilelocation

$form = New-Object System.Windows.Forms.Form
$form.Text = 'Update HOSTS File'
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = 'CenterScreen'

$AddHosts = New-Object System.Windows.Forms.Button
$AddHosts.Location = New-Object System.Drawing.Point(55,120)
$AddHosts.Size = New-Object System.Drawing.Size(90,25)
$AddHosts.Text = 'Add Record'
$AddHosts.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $AddHosts
$form.Controls.Add($AddHosts)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(170,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,25)
$CancelButton.Text = 'Cancel'
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)

$Hostslabel = New-Object System.Windows.Forms.Label
$Hostslabel.Location = New-Object System.Drawing.Point(10,20)
$Hostslabel.Size = New-Object System.Drawing.Size(280,20)
$Hostslabel.Text = 'Enter New HOSTNAME/FQDN:'
$form.Controls.Add($Hostslabel)

$HoststextBox = New-Object System.Windows.Forms.TextBox
$HoststextBox.Location = New-Object System.Drawing.Point(10,40)
$HoststextBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($HoststextBox)

$IPlabel = New-Object System.Windows.Forms.Label
$IPlabel.Location = New-Object System.Drawing.Point(10,60)
$IPlabel.Size = New-Object System.Drawing.Size(280,20)
$IPlabel.Text = 'Enter IP:'
$form.Controls.Add($IPlabel)

$IPtextBox = New-Object System.Windows.Forms.TextBox
$IPtextBox.Location = New-Object System.Drawing.Point(10,80)
$IPtextBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($IPtextBox)

$form.Topmost = $true

$form.Add_Shown({($HoststextBox,$IPtextbox).Select()})

$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $inputhosts = $HoststextBox.Text
    $inputip = $IPtextBox.Text
    $newrecord = "$inputip $inputhosts"
    Add-Content -Path $hostsfilelocation -Value $newrecord
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...