Добавление / удаление записи файла hosts с использованием powershell повреждает файл - PullRequest
1 голос
/ 23 июня 2019

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

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

Я делаю это, чтобы добавить запись:

If ((Get-Content "$($env:windir)\system32\Drivers\etc\hosts" ) -notcontains "111.111.111.111 example.com")  
 {ac -Encoding UTF8  "$($env:windir)\system32\Drivers\etc\hosts" "111.111.111.111 example.com" }

Здесь - это то, как файл выглядит после его повреждения:

Спасибо за вашу помощь.

Решено: Удалить -Encoding UTF8

1 Ответ

2 голосов
/ 23 июня 2019

Потому что, как говорится в комментарии к файлу hosts, « IP-адрес и имя хоста должны быть разделены хотя бы одним пробелом. », пытаясь найти строку с ровно одним пробеломмежду ними может возвращаться значение false.

Я думаю, что для этого было бы лучше использовать Regex, поскольку он позволяет сопоставлять более одного пробела для отделения IP-адреса от имени хоста.Однако это требует использования [Regex]::Escape() в обеих частях записи, поскольку они содержат специальные символы регулярного выражения (точка).

Примерно так:

$hostsFile  = "$($env:windir)\system32\Drivers\etc\hosts"
$hostsEntry = '111.111.111.111 example.com'

# split the entry into separate variables
$ipAddress, $hostName = $hostsEntry -split '\s+',2
# prepare the regex
$re = '(?m)^{0}[ ]+{1}' -f [Regex]::Escape($ipAddress), [Regex]::Escape($hostName)

If ((Get-Content $hostsFile -Raw) -notmatch $re) {
    Add-Content -Path $hostsFile -Value $hostsEntry
}
...