Слушайте, давайте я расскажу, как получилось создать инструмент для настройки 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