Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 27

Добавление и удаление записей в host

27.03.2025, 21:15. Показов 2250. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой скрипт, но в нём есть проблема, он портит весь файл hosts иногда, удаляя все записи и оставляя его пустым. Как я понял, это происходит, если в файле hosts после всех записей не стоит пустая строка. Также, кажется, по этой же причине скрипт может добавить две записи в одну строку.

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$vpnActive = Get-NetAdapter | Where-Object { $_.Name -like "*VPN*" -and $_.Status -eq "Up" }
$hostsPath = "$env:SystemRoot\System32\drivers\etc\hosts"
$blockSite = "example.com"
 
if (!$vpnActive) {
    # Добавляем блокировку в hosts
    $blockEntry = "127.0.0.1 $blockSite`n127.0.0.1 www.$blockSite"
    if (-not (Get-Content $hostsPath | Select-String -Pattern $blockSite)) {
        Add-Content -Path $hostsPath -Value $blockEntry
    }
} else {
    # Удаляем блокировку из hosts
    (Get-Content $hostsPath) -notmatch $blockSite | Set-Content $hostsPath
}
Добавлено через 3 часа 43 минуты
Добавил это, но почему то если нет пустой строки создаёт две вместо одной
PowerShell
1
2
3
4
$content = Get-Content -Path $hostsPath -Raw
if (-not ($content -match "`n$")) {
    Add-Content -Path $hostsPath -Value "`n"
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2025, 21:15
Ответы с готовыми решениями:

Generic Host Process for Win 32 Services – обнаружена ошибка
Та же самая ошибка и у меня, только на операционной системе Windows Server 2003. Винду заново переустанавливать обязательно?

Скрипт на сервере сценариев Windows Scripting Host. Подключение сетевого диска
Пытаюсь подключить сетевой диск через скипт с расширение .vbs Диск и путь вводятся с клавиатуры пользователем. Но выбивает ошибку, что...

Поменять файл host всем пользователям домена
Есть Win2008R2. Задача поменять файл host всем пользователям домена. яндекс с поиском мне не помог. знаю что ad умеет это делать. но не...

11
 Аватар для volodin661
6627 / 2258 / 346
Регистрация: 10.12.2013
Сообщений: 7,809
27.03.2025, 21:16
PowerShell
1
2
function block-site([string]$name) { Add-Content -Path $env:windir\System32\drivers\etc\hosts  -Value "127.0.0.1 $name" }
function unblock-site([string]$name) { (Get-Content $env:windir\System32\drivers\etc\hosts).foreach({ $_ -replace ".+$name" }) | Out-File $env:windir\System32\drivers\etc\hosts  }


проверяем

PowerShell
1
2
block-site www.example.org
gc $env:windir\System32\drivers\etc\hosts
PowerShell
1
2
unblock-site www.example.org
gc $env:windir\System32\drivers\etc\hosts

вроде всё норм
1
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 27
27.03.2025, 21:40  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
вроде всё норм
Работает и на вид лучше, но тут так же, если в файле хост нет пустой строки добавит к существующему в конце. А при удаление удалит.
Пример там есть
127.0.0.1 наш.свйт
<<<<<<<< а тут нет пустой строки и при выполнение будет так
127.0.0.1 наш.сайт127.0.0.1 www.example.org
А при удалении удалит полностью вместе с 127.0.0.1 наш.сайт
0
 Аватар для volodin661
6627 / 2258 / 346
Регистрация: 10.12.2013
Сообщений: 7,809
28.03.2025, 04:09
Лучший ответ Сообщение было отмечено RedDark как решение

Решение

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

Добавлено через 2 часа 33 минуты
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
function is-vpn-active {
 
    $adapter =  (Get-NetAdapter).where({ $_.Name -like "*VPN*" })
    if ( $adapter.Status -eq "Up" ) {
        return $true
    } else {
        return $false
    }
}
 
function HOSTS {
 
    return "$env:windir\System32\drivers\etc\hosts"
#   "hosts"
} 
 
function block-site([string]$name) {
 
    Add-Content -Path (HOSTS) -Value ("{0}127.0.0.1 {1}{0}::1 {1}" -f [Environment]::NewLine, $name );
}
 
function unblock-site([string]$name) {
    
    (Get-Content (HOSTS)).foreach({ $_ -replace ".+$name" }).where({$_}) | Out-File (HOSTS)  
}
 
 
switch ( is-vpn-active ) {
 
    $true
    { unblock-site www.example.org }
 
    $false
    { block-site   www.example.org }
 
}
1
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 27
28.03.2025, 08:51  [ТС]
Входит и выходит, замечательно выходит!
0
2798 / 497 / 119
Регистрация: 26.09.2020
Сообщений: 942
Записей в блоге: 5
28.03.2025, 08:56
RedDark, думаю — Get-Content и Set-Content не должны быть в одном конвейере.

Немного хеш-таблиц:
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
param (
    [Parameter(Mandatory, ValueFromPipeline)]
    [ValidateNotNullOrEmpty()]
    [string] $HostName,
 
    [ValidateScript({Test-Path -LiteralPath $_ -PathType Leaf})]
    [string] $Hosts = "$env:SystemRoot\System32\drivers\etc\hosts"
)
 
& @{
    $true = {
        & @{
            $true = {
                $Content = Get-Content $Hosts | Where-Object { $_ -NotMatch $HostName } 
                ($Content | Out-String).TrimEnd([Environment]::NewLine) | Out-File $Hosts
            }
            $false = { $null }
        }[[bool](Get-Content $Hosts | Select-String -Pattern $HostName -Quiet)]
    }
    $false = {
        & @{
            $true = { $null }
            $false = {
                Add-Content $Hosts -Value (
                    '{0}{2,-20}{1}{0}{3,-20}{1}' -f @(
                        [Environment]::NewLine, $HostName, '0.0.0.0', '::'
                    )
                )
            }
        }[[bool](Get-Content $Hosts | Select-String -Pattern $HostName -Quiet)]
    }
}[(Get-NetAdapter -Name '*vpn*').Status -eq 'Up']
Определять адаптер надо бы понадёжнее, а то может оказаться не один *vpn*.
2
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 27
28.03.2025, 09:15  [ТС]
Надо кодировку добавить, файл сохраняется в UTF 16 LE после чего весть hosts игнорируется. Надо что бы сохранялась в UTF 8
0
2798 / 497 / 119
Регистрация: 26.09.2020
Сообщений: 942
Записей в блоге: 5
28.03.2025, 10:38
Цитата Сообщение от RedDark Посмотреть сообщение
Надо кодировку добавить, файл сохраняется в UTF 16 LE после чего весть hosts игнорируется. Надо что бы сохранялась в UTF 8
У меня не повторяется.
Параметр Encoding есть у: Get-Content, Out-File, Add-Content и даже у Select-String зачем то.
0
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 27
28.03.2025, 12:46  [ТС]
Сам исправил эти две строчки, теперь нет проблем с utf16le
PowerShell
1
2
 Add-Content -Path (HOSTS) -Value ("{0}127.0.0.1 {1}{0}::1 {1}" -f [Environment]::NewLine, $name ) -Encoding UTF8
 (Get-Content (HOSTS) -Encoding UTF8).foreach({ $_ -replace ".+$name" }).where({$_}) | Out-File (HOSTS) -Encoding UTF8
0
Любознательный
 Аватар для YuS_2
7401 / 2247 / 359
Регистрация: 10.03.2016
Сообщений: 5,187
28.03.2025, 13:40
Цитата Сообщение от iNNOKENTIY21 Посмотреть сообщение
даже у Select-String зачем то.
sls умеет файлы читать, поэтому без кодировки туго...
0
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 27
28.03.2025, 18:29  [ТС]
Уведомления можно ещё добавить. Только русский не понимает.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
switch ( is-vpn-active ) {
 
    $true
    { unblock-site www.h.k
      unblock-site h.k
     
     [reflection.assembly]::loadwithpartialname('System.Windows.Forms')
     [reflection.assembly]::loadwithpartialname('System.Drawing')
     $notify = new-object system.windows.forms.notifyicon
     $notify.icon = [System.Drawing.SystemIcons]::Information
     $notify.visible = $true
     $notify.showballoontip(10,'hk','Closed',[system.windows.forms.tooltipicon]::None)
    }
 
    $false
    { block-site   www.h.k
      block-site   h.k
    
     [reflection.assembly]::loadwithpartialname('System.Windows.Forms')
     [reflection.assembly]::loadwithpartialname('System.Drawing')
     $notify = new-object system.windows.forms.notifyicon
     $notify.icon = [System.Drawing.SystemIcons]::Information
     $notify.visible = $true
     $notify.showballoontip(10,'hk','Is open',[system.windows.forms.tooltipicon]::None)
    }
 
}
0
0 / 0 / 0
Регистрация: 07.10.2021
Сообщений: 27
29.03.2025, 13:43  [ТС]
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
switch ( is-vpn-active ) {
 
    $true
    { unblock-site www.h.k
      unblock-site h.k   
 
     Add-Type -AssemblyName System.Windows.Forms
     $notify = New-Object System.Windows.Forms.NotifyIcon
     $notify.Icon = [System.Drawing.SystemIcons]::Shield 
     $notify.Visible = $true
     $notify.ShowBalloonTip(5000, "HK", "Доступ к сайту открыт!", [System.Windows.Forms.ToolTipIcon]::None)
    }
 
    $false
    { block-site   www.h.k
      block-site   h.k
    
     Add-Type -AssemblyName System.Windows.Forms
     $notify = New-Object System.Windows.Forms.NotifyIcon
     $notify.Icon = [System.Drawing.SystemIcons]::Shield 
     $notify.Visible = $true
     $notify.ShowBalloonTip(5000, "HK", "Доступ к сайту закрыт!", [System.Windows.Forms.ToolTipIcon]::None)
    }
 
}
Что бы русский работал в файле скрипта надо кодировку поменять Windows - 1251
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.03.2025, 13:43
Помогаю со студенческими работами здесь

Скрипты Windows Scripting Host - JavaScript
В зависимости от запроса 1. для каждого типа файлов -TXT,INF,ASM - выдать число строк с заданным текстом; 2. отсортировать файлы...

Ошибка Windows Script Host
При попытке выгрузки вылазит вот такая гадость.Как исправить?Windows Server 2008 в чем может быть загвоздка?Обновления на ОС не...

Раздача файла host на пользователей домена
В компании насчитывается до 250 станций во внутренней сети. Есть доступ на внешние web-сервера, такие как документооборот. Чтобы на них...

Перенаправить через Host на сайт в папке
Ребят, как через хост указать локальное местоположение файла сайта, что бы он открывался вместо глобального? К примеру сохранил я копию...

Замена строки в файле host
Здравствуйте уважаемые! Есть задача заменить в файле host строку типа 192.168.1.1 на другой ip, нужен батник скрипт... что бы руками не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru