Слушайте, давайте я расскажу, как получилось создать инструмент для настройки Windows на чистом PowerShell с графическим интерфейсом. Не "еще один бустер", а нормальное приложение, которое меняет систему и сразу закрывается — без всяких фоновых процессов.

Проблема: почему я вообще этим занялся?

Честно говоря, надоело смотреть, как люди ставят "оптимизаторы", которые сами тормозят ПК. Знаете, те самые, что висят в трее и жрут 200 МБ RAM. Или еще хуже — вносят изменения в реестр, которые потом невозможно откатить.

Я сам долгое время работал с корпоративными машинами, где надо было быстро настроить десятки ПК. И понял: нужен инструмент, который:

  • Создает точку отката перед любыми изменениями

  • Работает через официальные механизмы Windows

  • Не остается в памяти после запуска

  • Показывает все, что делает, в понятном логе

Короче, я решил написать свой. И знаете что? Получилось.

Архитектура: как это работает

Концепция простая

Локальные бэкапы в %LOCALAPPDATA%, работа через reg.exe и netsh, GUI на WinForms без внешних DLL. Всё. Никакой магии.

Ключевые техники

1. Мастер-бэкап с разделением HKCU/HKLM

function New-RegistryBackup {
    $timestamp = Get-Date -Format "yyyy-MM-dd_HH-mm"
    $backupPath = "$env:LOCALAPPDATA\MyOptimizer\Backups"
    
    if (!(Test-Path $backupPath)) { New-Item $backupPath -Force }
    
    # Бэкап ветки текущего пользователя (всегда)
    reg export HKCU "$backupPath\HKCU_$timestamp.reg" /y
    
    # Бэкап системной ветки (только при админ-правах)
    if ([Security.Principal.WindowsIdentity]::GetCurrent().Groups -contains 'S-1-5-32-544') {
        reg export HKLM "$backupPath\HKLM_$timestamp.reg" /y
    }
}

Вот и всё. Каждый бэкап — отдельный файл с датой. Откат — просто двойной клик по .reg или reg import в консоли.

2. Приоритет CPU без резидентных процессов

Это моя любимая часть. Через реестр Image File Execution Options можно задать приоритет приложению, и Windows сама будет его применять. Никакого фонового процесса!

function Set-AppPriority {
    param(
        [string]$AppName,      # Например: "photoshop.exe"
        [ValidateRange(1,6)][int]$Priority = 3 # 3=High
    )
    
    $regPath = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\$AppName\PerfOptions"
    
    # Создаём ключ, если его нет
    if (!(Test-Path $regPath)) {
        New-Item -Path $regPath -Force | Out-Null
    }
    
    # Устанавливаем High Priority (0x3)
    reg add $regPath /v CpuPriorityClass /t REG_DWORD /d $Priority /f
    
    Write-Host "✅ Приоритет установлен для $AppName"
}

Я использую это для Photoshop, Office и Chrome. Разница ощутимая. Проверял лично.

3. Сетевые твики

function Reset-NetworkStack {
    netsh int ip reset | Out-Null
    netsh winsock reset | Out-Null
    ipconfig /flushdns | Out-Null
    
    # Cloudflare DNS без перезагрузки
    Get-WmiObject Win32_NetworkAdapterConfiguration | 
        Where-Object { $_.IPEnabled } | 
        ForEach-Object { $_.SetDNSServerSearchOrder(@("1.1.1.1","1.0.0.1")) }
}

Эффект? Скачал у друга отзыв: "Пинг в Valorant упал с 80 до 45". Может, совпадение, но всё же.

4. FPS Mode: отключаем визуальные эффекты

function Enable-FPSMode {
    reg add "HKCU\Control Panel\Desktop\WindowMetrics" /v MinAnimate /d "0" /f
    reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize" /v EnableTransparency /d 0 /f
}

Важный момент: изменения вступают в силу только после перелогина. Я делал встроенное напоминание в GUI.

GUI: минимум кода, максимум пользы

Add-Type -AssemblyName System.Windows.Forms

$form = New-Object System.Windows.Forms.Form
$form.Text = "Optimizer v1.0"
$form.Size = New-Object System.Drawing.Size(400,250)

$btnBackup = New-Object System.Windows.Forms.Button
$btnBackup.Text = "? Бэкап"
$btnBackup.Location = New-Object System.Drawing.Point(20,20)
$btnBackup.Add_Click({ New-RegistryBackup })
$form.Controls.Add($btnBackup)

$btnFPS = New-Object System.Windows.Forms.Button
$btnFPS.Text = "? FPS Mode"
$btnFPS.Location = New-Object System.Drawing.Point(20,60)
$btnFPS.Add_Click({ Enable-FPSMode })
$form.Controls.Add($btnFPS)

$logBox = New-Object System.Windows.Forms.TextBox
$logBox.Location = New-Object System.Drawing.Point(20,120)
$logBox.Size = New-Object System.Drawing.Size(340,80)
$logBox.Multiline = $true
$logBox.ScrollBars = "Vertical"
$form.Controls.Add($logBox)

$form.ShowDialog()

Вот и всё. Никаких сложных XAML или WPF. Чистый PowerShell, и работает.

Безопасность: три правила, которые я для себя вывел

Правило 1: Без бэкапа — никаких изменений

$backups = Get-ChildItem "$env:LOCALAPPDATA\MyOptimizer\Backups\*.reg"
if (!$backups) {
    [System.Windows.Forms.MessageBox]::Show("Сначала сделай бэкап!", "Стоп")
    return
}

Правило 2: Только родные утилиты

  • Никаких сторонних DLL

  • Никаких хуков ядра

  • Только reg.exe, netsh, sc.exe

Правило 3: Прозрачность

Все действия пишутся в лог. Пользователь видит, что происходит. Это важно.

Реальные цифры

Тестировал на старом ноутбуке Dell Latitude 7480 (i5 7th gen, 8GB RAM, HDD):

  • Запуск Photoshop: 12 сек → 7 сек

  • Запуск Excel: 8 сек → 4 сек

  • Idle RAM: 3.2 GB → 2.8 GB

Результат? Коллега отменил план покупки нового ПК. Это лучшая благодарность.


Кастомизация для себя

Добавить приложение:

$myApps = @("vegas.exe", "blender.exe")
foreach ($app in $myApps) {
    Set-AppPriority -AppName $app -Priority 3
}

Сделать свой пресет:

function Enable-MyPreset {
    reg add "HKCU\Software\MyCorp\Settings" /v TurboMode /d 1 /f
}

Важный нюанс

Перед использованием в production обязательно тестируйте в VM! Я один раз поломал себе реестр тестовой машины, потому что забыл проверить, существует ли ключ. Урок усвоил.

Автор: Девелопер, который верит в магию PowerShell
Больше статей: medium

Комментарии (0)