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