Crmgo Блог

Оптимизация старого компьютера: медиацентр для телевизора на Windows 10

Оптимизация старого компьютера: медиацентр для телевизора на Windows 10

Как облегчить Windows 10 на слабом ПК (E1-2100, 4 ГБ, HDD) для просмотра фильмов на телевизоре: скрипт Optimize-MoviePC.ps1, откат через -Restore и настройки браузера.

Оптимизация старого компьютера: медиацентр для телевизора на Windows 10

Старый ноутбук или системный блок пылится без дела? Его можно превратить в простой медиацентр для телевизора: фильмы, YouTube и онлайн-кинотеатры через HDMI. Главная проблема — слабое железо: Windows 10 нагружает процессор, память и диск фоновыми задачами, и видео начинает тормозить. В этой статье разбираем, как облегчить Windows 10 для просмотра фильмов с помощью PowerShell-скрипта Optimize-MoviePC.ps1, и как настроить браузер, чтобы старый компьютер как медиацентр работал без рывков.

Для кого это

Скрипт создавался под очень слабый ПК: процессор AMD E1-2100 (2 ядра, 1,0 ГГц), видеоядро Radeon HD 8210, 4 ГБ оперативной памяти и обычный жёсткий диск (HDD). Если у вас похожая конфигурация и тормозит видео на YouTube даже в низком качестве, — это ваш случай. Цель: сохранить Wi-Fi, браузер и воспроизведение видео и отключить всё фоновое, из-за чего картинка замирает.

Важно: скрипт не тестировался на реальной машине автора статьи. Он работает только в Windows 10, требует PowerShell 5.1 и прав администратора. Перед запуском он сам делает резервные копии, но применяйте его осознанно и на свой риск.

Что делает скрипт

Сначала — резервные копии

  • Создаёт точку восстановления системы (если Windows это позволяет).
  • Создаёт папку backup\ рядом со скриптом: список состояний служб services-before.csv, выгрузки нужных разделов реестра (.reg) и журнал last-run.log.

Службы

  • Отключает телеметрию и диагностику (DiagTrack, WerSvc, DPS и др.), печать и факс (Spooler), удалённый доступ (RDP, RemoteRegistry, WinRM), Xbox, геолокацию, датчики, смарт-карты и биометрию, сетевое обнаружение и общий доступ (SSDP, UPnP, LanmanServer), индексацию поиска (WSearch), SysMain/Superfetch, Hyper-V и многие фоновые пользовательские службы.
  • Службы Windows Update переводятся в ручной режим (не отключаются): уведомление перед загрузкой, без автоперезагрузки при вошедшем пользователе; Delivery Optimization выключается.
  • Принудительно оставляет включёнными сеть и Wi-Fi, звук (включая MMCSS), Bluetooth, ключевые службы Windows и защиту (Defender, брандмауэр).

Планировщик, интерфейс, реклама

  • Отключает фоновые задачи: оценка совместимости, CEIP, отзывы, карты, отчёты об ошибках, WinSAT, семейная безопасность и т. п.
  • Визуальные эффекты — «наилучшее быстродействие»: без анимаций, прозрачности и Aero Peek (ClearType сохраняется). Выключает уведомления и «Новости и интересы».
  • Отключает подсказки, рекламный ID, Bing/Cortana в поиске, телеметрию, ленту активности и Game DVR.

Память, диск, питание

  • Выключает сжатие памяти и объединение страниц, prefetch/superfetch; задаёт фиксированный файл подкачки 6 ГБ (4 ГБ при нехватке места); отключает гибернацию и быстрый запуск.
  • Включает план «Высокая производительность»: без сна и отключения диска, процессор 100%, Wi-Fi-адаптер на максимальной производительности, без выборочной приостановки USB; монитор гаснет через 20 минут (от сети).
  • Повышает приоритет мультимедиа (MMCSS) для звука и воспроизведения.

Автозагрузка и Defender

  • Записи автозапуска помечаются отключёнными (не удаляются), ярлыки из папки «Автозагрузка» переносятся в backup\startup-shortcuts. OneDrive останавливается, синхронизация отключается политикой — файлы не удаляются.
  • Defender остаётся включённым, но с низким приоритетом (нагрузка при сканировании 5%); в исключения добавляются только папки кэша браузеров.

В конце скрипт показывает сводку, напоминает о перезагрузке, советует раз в месяц запускать defrag C: /O и даёт рекомендации по браузеру.

Чего скрипт НЕ трогает

  • Ваши документы, фото, загрузки и профили браузеров.
  • Драйверы, Windows Defender и брандмауэр.
  • Wi-Fi, DHCP, DNS, звук и Bluetooth.
  • Windows Update (только переводит в ручной режим), службу дефрагментации, RunOnce.
  • Не удаляет значения реестра и никогда сам не перезагружает компьютер.

Как запустить: пошагово

  1. Положите Optimize-MoviePC.ps1 в отдельную папку. Двойной щелчок по файлу не сработает.
  2. Откройте Windows PowerShell от имени администратора (Пуск → правый клик по PowerShell → «Запуск от имени администратора»).
  3. Разрешите запуск скриптов только для текущего окна:
    Set-ExecutionPolicy -Scope Process Bypass -Force
  4. Перейдите в папку со скриптом (если в пути есть пробелы — возьмите его в кавычки):
    cd "C:\путь\к\папке"
  5. Запустите:
    .\Optimize-MoviePC.ps1
  6. Дождитесь сводки и перезагрузите компьютер, когда не смотрите фильм.

⬇ Скачать Optimize-MoviePC.ps1

Показать полный код скрипта Optimize-MoviePC.ps1
#Requires -Version 5.1
# =============================================================================
# RUN AS ADMINISTRATOR.
# Запускать от имени администратора.
#
# Правый клик по «Windows PowerShell» -> «Запуск от имени администратора», затем:
#   Set-ExecutionPolicy -Scope Process Bypass -Force
#   cd C:\путь\к\папке
#   .\Optimize-MoviePC.ps1
#
# Откат типов запуска служб и сохранённых веток реестра:
#   .\Optimize-MoviePC.ps1 -Restore
#
# Для чего скрипт
#   Слабый ПК: AMD E1-2100 (2 ядра, 1,0 ГГц, Radeon HD 8210), 4 ГБ RAM, HDD.
#   Нужны только Wi-Fi, браузер и воспроизведение видео.
#
# Чего скрипт НЕ делает
#   - не удаляет документы, фото, загрузки, папку OneDrive и профили браузера;
#   - не трогает драйверы (AMD, Realtek, Wi-Fi и любые другие);
#   - не отключает службы, которых нет в списках ниже;
#   - не отключает Защитник Windows и брандмауэр;
#   - не выключает Wi-Fi, DHCP, DNS, звук и планировщик мультимедиа;
#   - не перезагружает компьютер сам.
#
# Запускайте из той учётной записи, которой смотрите кино, и эта учётка должна
# быть администратором. Иначе личные настройки рабочего стола попадут не в тот профиль.
# Службы (они общие для всего ПК) настраиваются в любом случае.
#
# После выполнения нужна обычная перезагрузка, когда фильм не идёт.
# Рекомендация по браузеру — в конце этого файла и в browser-recommendation.txt.
# =============================================================================

param(
    [switch]$Restore
)

$ErrorActionPreference = "Continue"

if (-not $PSScriptRoot) {
    $PSScriptRoot = Split-Path -Parent $MyInvocation.MyCommand.Path
}

# Имена автозагрузки, которые нельзя гасить: обновления браузера и значок защиты.
$script:StartupKeepPattern = "(?i)(SecurityHealth|WindowsDefender|Windows Defender|Defender|update|updater|Maintenance|MozillaMaintenance)"

$script:DisabledOk = 0
$script:DisabledFail = 0

function Test-IsAdministrator {
    $identity = [Security.Principal.WindowsIdentity]::GetCurrent()
    $principal = New-Object Security.Principal.WindowsPrincipal($identity)
    return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}

function Set-ServiceStartupSafe {
    param(
        [Parameter(Mandatory = $true)][string]$Name,
        [Parameter(Mandatory = $true)][ValidateSet("Automatic", "Manual", "Disabled", "Boot", "System")][string]$StartupType
    )
    try {
        Set-Service -Name $Name -StartupType $StartupType -ErrorAction Stop
        return $true
    }
    catch {
        $map = @{
            Automatic = "auto"
            Manual    = "demand"
            Disabled  = "disabled"
            Boot      = "boot"
            System    = "system"
        }
        & sc.exe config $Name start= $map[$StartupType] | Out-Null
        if ($LASTEXITCODE -eq 0) {
            return $true
        }
        Write-Warning "  Не удалось сменить тип запуска ${Name}: $($_.Exception.Message)"
        return $false
    }
}

function Disable-ExtraService {
    param([Parameter(Mandatory = $true)][string]$Name)

    $found = @(Get-Service -Name $Name -ErrorAction SilentlyContinue | Where-Object { $_ })
    if ($found.Count -eq 0) {
        Write-Host "  [нет такой службы] $Name" -ForegroundColor DarkGray
        return
    }

    foreach ($svc in $found) {
        try {
            if ($svc.Status -ne "Stopped") {
                Stop-Service -Name $svc.Name -Force -ErrorAction SilentlyContinue
            }
            if (Set-ServiceStartupSafe -Name $svc.Name -StartupType Disabled) {
                $script:DisabledOk++
                Write-Host "  [выкл] $($svc.Name)" -ForegroundColor Green
            }
            else {
                $script:DisabledFail++
            }
        }
        catch {
            $script:DisabledFail++
            Write-Warning "  $($svc.Name): $($_.Exception.Message)"
        }
    }
}

function Repair-ServiceIfDisabled {
    param(
        [Parameter(Mandatory = $true)][string]$Name,
        [ValidateSet("Automatic", "Manual")][string]$StartupType = "Automatic",
        [switch]$Start
    )

    try {
        $svc = Get-Service -Name $Name -ErrorAction SilentlyContinue
        if (-not $svc) {
            Write-Host "  [нет такой службы] $Name" -ForegroundColor DarkGray
            return
        }

        if ($svc.StartType -eq "Disabled") {
            if (Set-ServiceStartupSafe -Name $Name -StartupType $StartupType) {
                Write-Host "  [восстановлено] $Name была выключена -> $StartupType" -ForegroundColor Yellow
            }
        }
        else {
            Write-Host "  [оставляем] $Name ($($svc.StartType))" -ForegroundColor Cyan
        }

        if ($Start) {
            $svc = Get-Service -Name $Name -ErrorAction SilentlyContinue
            if ($svc -and $svc.Status -ne "Running" -and $svc.StartType -ne "Disabled") {
                & sc.exe start $Name | Out-Null
                if ($LASTEXITCODE -eq 0 -or $LASTEXITCODE -eq 1056) {
                    Write-Host "  [запуск] $Name" -ForegroundColor Cyan
                }
                else {
                    Write-Warning "  Служба $Name не запустилась (код $LASTEXITCODE). После перезагрузки проверьте звук и Wi-Fi."
                }
            }
        }
    }
    catch {
        Write-Warning "  $Name : $($_.Exception.Message)"
    }
}

function Set-ManualService {
    param([Parameter(Mandatory = $true)][string]$Name)
    $svc = Get-Service -Name $Name -ErrorAction SilentlyContinue
    if (-not $svc) {
        Write-Host "  [нет такой службы] $Name" -ForegroundColor DarkGray
        return
    }
    if (Set-ServiceStartupSafe -Name $Name -StartupType Manual) {
        Write-Host "  [вручную] $Name" -ForegroundColor Green
    }
}

function Set-RegDword {
    param(
        [Parameter(Mandatory = $true)][string]$Path,
        [Parameter(Mandatory = $true)][string]$Name,
        [Parameter(Mandatory = $true)][int]$Value
    )
    if (-not (Test-Path -LiteralPath $Path)) {
        New-Item -Path $Path -Force | Out-Null
    }
    New-ItemProperty -LiteralPath $Path -Name $Name -Value $Value -PropertyType DWord -Force | Out-Null
}

function Set-RegString {
    param(
        [Parameter(Mandatory = $true)][string]$Path,
        [Parameter(Mandatory = $true)][string]$Name,
        [Parameter(Mandatory = $true)][string]$Value
    )
    if (-not (Test-Path -LiteralPath $Path)) {
        New-Item -Path $Path -Force | Out-Null
    }
    New-ItemProperty -LiteralPath $Path -Name $Name -Value $Value -PropertyType String -Force | Out-Null
}

function Export-RegKey {
    param(
        [Parameter(Mandatory = $true)][string]$Key,
        [Parameter(Mandatory = $true)][string]$File
    )
    $full = Join-Path $script:BackupDir $File
    & reg.exe export $Key $full /y 2>&1 | Out-Null
    if ($LASTEXITCODE -eq 0) {
        Write-Host "  [копия реестра] $Key" -ForegroundColor DarkGray
    }
}

function Disable-StartupRunKey {
    param(
        [Parameter(Mandatory = $true)][string]$RunKey,
        [Parameter(Mandatory = $true)][string]$ApprovedKey
    )
    if (-not (Test-Path -LiteralPath $RunKey)) {
        return
    }
    if (-not (Test-Path -LiteralPath $ApprovedKey)) {
        New-Item -Path $ApprovedKey -Force | Out-Null
    }

    $item = Get-Item -LiteralPath $RunKey
    foreach ($valueName in @($item.GetValueNames())) {
        if ([string]::IsNullOrWhiteSpace($valueName)) {
            continue
        }
        if ($valueName -match $script:StartupKeepPattern) {
            Write-Host "  [автозагрузка оставлена] $valueName" -ForegroundColor Cyan
            continue
        }
        # 0x03 в первом байте — «Отключено» в диспетчере задач. Саму команду не удаляем.
        $disabled = [byte[]](0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00)
        New-ItemProperty -LiteralPath $ApprovedKey -Name $valueName -Value $disabled -PropertyType Binary -Force | Out-Null
        Write-Host "  [автозагрузка выкл] $valueName" -ForegroundColor Green
    }
}

function Suspend-StartupFolder {
    param(
        [Parameter(Mandatory = $true)][string]$SourceFolder,
        [Parameter(Mandatory = $true)][string]$BackupFolder
    )
    if (-not (Test-Path -LiteralPath $SourceFolder)) {
        return
    }
    New-Item -ItemType Directory -Path $BackupFolder -Force | Out-Null
    Get-ChildItem -LiteralPath $SourceFolder -Force | Where-Object { -not $_.PSIsContainer } | ForEach-Object {
        if ($_.Name -eq "desktop.ini") {
            return
        }
        if ($_.Name -match $script:StartupKeepPattern) {
            Write-Host "  [папка автозагрузки оставлена] $($_.Name)" -ForegroundColor Cyan
            return
        }
        Move-Item -LiteralPath $_.FullName -Destination (Join-Path $BackupFolder $_.Name) -Force
        Write-Host "  [ярлык убран в backup] $($_.Name)" -ForegroundColor Green
    }
}

function Restore-StartupFolder {
    param(
        [Parameter(Mandatory = $true)][string]$BackupFolder,
        [Parameter(Mandatory = $true)][string]$SourceFolder
    )
    if (-not (Test-Path -LiteralPath $BackupFolder)) {
        return
    }
    if (-not (Test-Path -LiteralPath $SourceFolder)) {
        New-Item -ItemType Directory -Path $SourceFolder -Force | Out-Null
    }
    Get-ChildItem -LiteralPath $BackupFolder -Force | Where-Object { -not $_.PSIsContainer } | ForEach-Object {
        $dest = Join-Path $SourceFolder $_.Name
        if (Test-Path -LiteralPath $dest) {
            Write-Host "  [ярлык уже на месте] $($_.Name)" -ForegroundColor DarkGray
            return
        }
        Move-Item -LiteralPath $_.FullName -Destination $dest
        Write-Host "  [ярлык возвращён] $($_.Name)" -ForegroundColor Green
    }
}

function Invoke-Restore {
    $backup = Join-Path $PSScriptRoot "backup"
    if (-not (Test-Path -LiteralPath $backup)) {
        Write-Host "Папка backup не найдена. Откатывать нечего." -ForegroundColor Yellow
        Write-Host "Если точка восстановления создалась, откройте: Панель управления -> Восстановление -> Запуск восстановления системы."
        return
    }

    Write-Host "Возвращаем типы запуска служб из backup\services-before.csv ..." -ForegroundColor Cyan
    $csv = Join-Path $backup "services-before.csv"
    if (Test-Path -LiteralPath $csv) {
        $rows = Import-Csv -LiteralPath $csv
        foreach ($row in $rows) {
            $type = switch ($row.StartMode) {
                "Auto" { "Automatic" }
                "Manual" { "Manual" }
                "Disabled" { "Disabled" }
                "Boot" { "Boot" }
                "System" { "System" }
                default { $null }
            }
            if (-not $type -or [string]::IsNullOrWhiteSpace($row.Name)) {
                continue
            }
            if (Set-ServiceStartupSafe -Name $row.Name -StartupType $type) {
                Write-Host "  [служба] $($row.Name) -> $type" -ForegroundColor DarkGray
            }
        }
    }
    else {
        Write-Warning "Файл services-before.csv не найден. Типы запуска служб не восстановлены."
    }

    Write-Host "Возвращаем сохранённые ветки реестра ..." -ForegroundColor Cyan
    Get-ChildItem -LiteralPath $backup -Filter "*.reg" -ErrorAction SilentlyContinue | ForEach-Object {
        & reg.exe import $_.FullName | Out-Null
        if ($LASTEXITCODE -eq 0) {
            Write-Host "  [реестр] $($_.Name)" -ForegroundColor DarkGray
        }
        else {
            Write-Warning "  Не удалось импортировать $($_.Name)"
        }
    }

    $userStartup = [Environment]::GetFolderPath("Startup")
    $commonStartup = Join-Path $env:ProgramData "Microsoft\Windows\Start Menu\Programs\Startup"
    Restore-StartupFolder -BackupFolder (Join-Path $backup "startup-shortcuts\user") -SourceFolder $userStartup
    Restore-StartupFolder -BackupFolder (Join-Path $backup "startup-shortcuts\common") -SourceFolder $commonStartup

    Write-Host ""
    Write-Host "Откат служб, реестра и ярлыков автозагрузки выполнен." -ForegroundColor Green
    Write-Host "Сжатие памяти этим откатом не включается. Если нужно вернуть его:" -ForegroundColor Yellow
    Write-Host "  Enable-MMAgent -MemoryCompression -PageCombining"
    Write-Host "Гибернация этим откатом не включается. Если нужно вернуть её: powercfg -h on"
    Write-Host "Перезагрузите компьютер."
}

function Set-FixedPageFile {
    # Фиксированный файл подкачки не разрастается посреди фильма.
    # Рост pagefile.sys на HDD — это длинная пауза картинки.
    # Размер не больше 6144 МБ: на почти полном диске файл не трогаем.
    $mmPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management"
    $pageName = "$env:SystemDrive\pagefile.sys"

    $freeMb = 0
    $disk = Get-CimInstance Win32_LogicalDisk -Filter "DeviceID='$env:SystemDrive'" -ErrorAction SilentlyContinue
    if ($disk) {
        $freeMb = [int64]($disk.FreeSpace / 1MB)
    }

    $existingMb = 0
    $settingsPreview = @(Get-CimInstance Win32_PageFileSetting -ErrorAction SilentlyContinue | Where-Object { $_ })
    foreach ($entry in $settingsPreview) {
        $current = 0
        if ($entry.InitialSize) { $current = [int]$entry.InitialSize }
        if ($current -gt $existingMb) { $existingMb = $current }
    }

    $targetMb = 0
    $growTo6144 = 6144 - $existingMb
    if ($growTo6144 -lt 0) { $growTo6144 = 0 }
    $growTo4096 = 4096 - $existingMb
    if ($growTo4096 -lt 0) { $growTo4096 = 0 }

    if ($freeMb -ge ($growTo6144 + 2048)) {
        $targetMb = 6144
    }
    elseif ($freeMb -ge ($growTo4096 + 1536)) {
        $targetMb = 4096
    }
    elseif ($existingMb -ge 2048 -and $existingMb -le 6144) {
        $targetMb = $existingMb
        Write-Host "  Мало свободного места ($freeMb МБ). Фиксируем уже существующий файл подкачки: $targetMb МБ." -ForegroundColor Yellow
    }
    else {
        Write-Warning "  На диске $($env:SystemDrive) свободно около $freeMb МБ. Файл подкачки не меняем, чтобы не забить диск."
        return
    }

    $pageSpec = "$pageName $targetMb $targetMb"
    $previousAuto = $true
    $previousFiles = $null
    try {
        $previousFiles = (Get-ItemProperty -LiteralPath $mmPath -Name PagingFiles -ErrorAction SilentlyContinue).PagingFiles
        $cs = Get-CimInstance Win32_ComputerSystem
        $previousAuto = [bool]$cs.AutomaticManagedPagefile

        if ($previousAuto) {
            Set-CimInstance -InputObject $cs -Property @{ AutomaticManagedPagefile = $false } -ErrorAction Stop
        }

        $settings = @(Get-CimInstance Win32_PageFileSetting -ErrorAction SilentlyContinue | Where-Object { $_ })
        $match = $settings | Where-Object { $_.Name -eq $pageName } | Select-Object -First 1
        if ($match) {
            Set-CimInstance -InputObject $match -Property @{ InitialSize = $targetMb; MaximumSize = $targetMb } -ErrorAction Stop
        }
        else {
            Set-WmiInstance -Class Win32_PageFileSetting -Arguments @{
                Name        = $pageName
                InitialSize = $targetMb
                MaximumSize = $targetMb
            } -ErrorAction Stop | Out-Null
        }

        New-ItemProperty -LiteralPath $mmPath -Name PagingFiles -Value @($pageSpec) -PropertyType MultiString -Force | Out-Null
        New-ItemProperty -LiteralPath $mmPath -Name ClearPageFileAtShutdown -Value 0 -PropertyType DWord -Force | Out-Null
        Write-Host "  [ок] Файл подкачки зафиксирован: $targetMb МБ на $pageName (после перезагрузки)." -ForegroundColor Green
    }
    catch {
        Write-Warning "  Файл подкачки оставлен как был: $($_.Exception.Message)"
        try {
            if ($null -ne $previousFiles) {
                New-ItemProperty -LiteralPath $mmPath -Name PagingFiles -Value $previousFiles -PropertyType MultiString -Force | Out-Null
            }
            if ($previousAuto) {
                $cs2 = Get-CimInstance Win32_ComputerSystem
                Set-CimInstance -InputObject $cs2 -Property @{ AutomaticManagedPagefile = $true } -ErrorAction SilentlyContinue
            }
        }
        catch {
            Write-Warning "  Не удалось автоматически вернуть прежний файл подкачки. После перезагрузки откройте: Система -> Дополнительно -> Быстродействие -> Дополнительно -> Виртуальная память."
        }
    }
}

function Protect-NeededServices {
    Write-Host ""
    Write-Host "Нужные службы (если какая-то была выключена раньше — включаем обратно)" -ForegroundColor Cyan

    # Сеть и Wi-Fi. Без этого браузер не откроет страницу.
    @(
        "WlanSvc",   # WLAN AutoConfig — сам Wi-Fi
        "Wcmsvc",    # диспетчер подключений
        "Dhcp",      # адрес от роутера
        "Dnscache",  # DNS-клиент
        "NlaSvc",    # определяет, что сеть есть
        "nsi",       # сетевой стек, от него зависит DHCP
        "netprofm",  # профили сетей
        "Netman",
        "NcbService",
        "EventSystem"
    ) | ForEach-Object {
        Repair-ServiceIfDisabled -Name $_ -StartupType Automatic -Start
    }

    # Эти службы обычно сами стартуют по запросу. Главное — не держать их в «Отключена».
    @(
        "WinHttpAutoProxySvc", # автонастройка прокси, её спрашивают браузеры
        "VaultSvc",            # сохранённые пароли Wi-Fi
        "RmSvc",               # радиоадаптер, режим полёта
        "Eaphost",             # WPA-Enterprise / 802.1X, если такая сеть
        "NetSetupSvc",
        "QWAVE"                # служба качества аудио/видео, по требованию
    ) | ForEach-Object {
        Repair-ServiceIfDisabled -Name $_ -StartupType Manual
    }

    # Звук и планировщик мультимедиа. Без них ролик будет немой или дёрганый.
    @(
        "Audiosrv",
        "AudioEndpointBuilder",
        "MMCSS"
    ) | ForEach-Object {
        Repair-ServiceIfDisabled -Name $_ -StartupType Automatic -Start
    }

    # Bluetooth оставляем: часто кино смотрят в беспроводных наушниках.
    Repair-ServiceIfDisabled -Name "bthserv" -StartupType Automatic -Start
    @(
        "BTAGService",
        "BthAvctpSvc",
        "DeviceAssociationService"
    ) | ForEach-Object {
        Repair-ServiceIfDisabled -Name $_ -StartupType Manual
    }

    # Каркас Windows. Эти службы не оптимизируют отключением — без них система неживая.
    @(
        "RpcSs",
        "DcomLaunch",
        "RpcEptMapper",
        "LSM",
        "SamSs",
        "ProfSvc",
        "UserManager",
        "Power",
        "PlugPlay",
        "Winmgmt",
        "EventLog",
        "Schedule",
        "SystemEventsBroker",
        "gpsvc",
        "CoreMessagingRegistrar",
        "BrokerInfrastructure",
        "StateRepository",
        "TextInputManagementService",
        "Appinfo",
        "ShellHWDetection",
        "FontCache",
        "Themes",
        "CryptSvc",
        "KeyIso",
        "camsvc",
        "StorSvc",
        "sppsvc",
        "AppXSvc",
        "ClipSVC",
        "TokenBroker",
        "TimeBrokerSvc",
        "msiserver",
        "TrustedInstaller",
        "VSS",
        "swprv",
        "defragsvc",
        "W32Time",
        "DsmSvc",
        "hidserv"
    ) | ForEach-Object {
        $startType = "Automatic"
        if ($_ -in @("KeyIso", "camsvc", "StorSvc", "AppXSvc", "ClipSVC", "TokenBroker", "TimeBrokerSvc", "msiserver", "TrustedInstaller", "VSS", "swprv", "defragsvc", "W32Time", "DsmSvc", "hidserv")) {
            $startType = "Manual"
        }
        Repair-ServiceIfDisabled -Name $_ -StartupType $startType
    }

    # Защита интернет-сессии. На слабом ПК она стоит ресурсов, но без неё смотреть кино в браузере рискованно.
    @(
        "WinDefend",
        "WdNisSvc",
        "SecurityHealthService",
        "wscsvc",
        "BFE",
        "mpssvc"
    ) | ForEach-Object {
        Repair-ServiceIfDisabled -Name $_ -StartupType Automatic -Start
    }
}

# --- Проверка прав -----------------------------------------------------------
if ($env:OS -ne "Windows_NT") {
    Write-Host "Этот скрипт предназначен только для Windows 10. Здесь он ничего не меняет." -ForegroundColor Red
    exit 1
}

if (-not (Test-IsAdministrator)) {
    Write-Host "Скрипт не запущен от имени администратора." -ForegroundColor Red
    Write-Host "Откройте PowerShell через «Запуск от имени администратора» и выполните:"
    Write-Host "  Set-ExecutionPolicy -Scope Process Bypass -Force"
    Write-Host "  & '$PSCommandPath'"
    exit 1
}

if ($Restore) {
    Invoke-Restore
    exit 0
}

$script:BackupDir = Join-Path $PSScriptRoot "backup"
New-Item -ItemType Directory -Path $script:BackupDir -Force | Out-Null
try {
    Start-Transcript -LiteralPath (Join-Path $script:BackupDir "last-run.log") -Force | Out-Null
}
catch {
    Write-Warning "Журнал транскрипта не включился: $($_.Exception.Message)"
}

try {
    Write-Host "Оптимизация Windows 10 для кино в браузере." -ForegroundColor White
    Write-Host "Процессор E1-2100, 4 ГБ RAM, жёсткий диск. Лишние службы будут выключены." -ForegroundColor White

    try {
        $explorer = Get-CimInstance Win32_Process -Filter "Name = 'explorer.exe'" -ErrorAction SilentlyContinue | Select-Object -First 1
        if ($explorer) {
            $ownerInfo = Invoke-CimMethod -InputObject $explorer -MethodName GetOwner
            $loggedOn = "$($ownerInfo.Domain)\$($ownerInfo.User)"
            $current = "$env:USERDOMAIN\$env:USERNAME"
            if ($loggedOn -and $current -and ($loggedOn -ne $current)) {
                Write-Warning "PowerShell работает как $current, а в систему вошёл $loggedOn."
                Write-Warning "Настройки рабочего стола попадут в профиль $current. Службы всё равно изменятся для всего ПК."
            }
        }
    }
    catch {
        Write-Warning "Не удалось сравнить текущего пользователя и вошедшего в систему."
    }

    # --- Точка восстановления и резервные копии ------------------------------
    # Сначала сохраняем состояние. Если картина после перезагрузки не устроит,
    # запустите скрипт с ключом -Restore или откатите точку в «Восстановлении системы».
    Write-Host ""
    Write-Host "Резервные копии" -ForegroundColor Cyan
    try {
        $srKey = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SystemRestore"
        if (-not (Test-Path -LiteralPath $srKey)) {
            New-Item -Path $srKey -Force | Out-Null
        }
        New-ItemProperty -LiteralPath $srKey -Name "SystemRestorePointCreationFrequency" -Value 0 -PropertyType DWord -Force | Out-Null
        Enable-ComputerRestore -Drive "$env:SystemDrive\" -ErrorAction SilentlyContinue
        Checkpoint-Computer -Description "Optimize-MoviePC before changes" -RestorePointType MODIFY_SETTINGS -ErrorAction Stop
        Write-Host "  [ок] Точка восстановления создана." -ForegroundColor Green
    }
    catch {
        Write-Warning "  Точка восстановления не создана: $($_.Exception.Message)"
        Write-Warning "  Продолжаем. Откат служб всё равно будет в папке backup."
    }

    try {
        Get-CimInstance Win32_Service |
            Select-Object Name, StartMode, State, DisplayName |
            Export-Csv -LiteralPath (Join-Path $script:BackupDir "services-before.csv") -NoTypeInformation -Encoding UTF8
        Write-Host "  [ок] Список служб сохранён в backup\services-before.csv" -ForegroundColor Green
    }
    catch {
        Write-Warning "  Не удалось сохранить список служб: $($_.Exception.Message)"
    }

    @(
        @{ Key = "HKCU\Control Panel\Desktop"; File = "hkcu-desktop.reg" },
        @{ Key = "HKCU\Control Panel\Desktop\WindowMetrics"; File = "hkcu-windowmetrics.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer"; File = "hkcu-explorer.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"; File = "hkcu-personalize.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\GameDVR"; File = "hkcu-gamedvr.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\PushNotifications"; File = "hkcu-toasts.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager"; File = "hkcu-content.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\Search"; File = "hkcu-search.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\BackgroundAccessApplications"; File = "hkcu-background.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo"; File = "hkcu-advertising.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"; File = "hkcu-run.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\DWM"; File = "hkcu-dwm.reg" },
        @{ Key = "HKCU\Software\Microsoft\Windows\CurrentVersion\Feeds"; File = "hkcu-feeds.reg" },
        @{ Key = "HKCU\System\GameConfigStore"; File = "hkcu-gameconfig.reg" },
        @{ Key = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"; File = "hklm-run.reg" },
        @{ Key = "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run"; File = "hklm-run32.reg" },
        @{ Key = "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved"; File = "hklm-startupapproved.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\DataCollection"; File = "hklm-datacollection.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate"; File = "hklm-windowsupdate.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\GameDVR"; File = "hklm-gamedvr.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\OneDrive"; File = "hklm-onedrive.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\Windows Search"; File = "hklm-windowssearch.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\CloudContent"; File = "hklm-cloudcontent.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\AppCompat"; File = "hklm-appcompat.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\System"; File = "hklm-systempolicy.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\Windows\DeliveryOptimization"; File = "hklm-deliveryopt.reg" },
        @{ Key = "HKLM\SOFTWARE\Policies\Microsoft\SQMClient\Windows"; File = "hklm-ceip.reg" },
        @{ Key = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile"; File = "hklm-mmcss.reg" },
        @{ Key = "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management"; File = "hklm-memory.reg" },
        @{ Key = "HKLM\SYSTEM\CurrentControlSet\Control\PriorityControl"; File = "hklm-priority.reg" },
        @{ Key = "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Power"; File = "hklm-power.reg" },
        @{ Key = "HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers"; File = "hklm-graphics.reg" }
    ) | ForEach-Object {
        Export-RegKey -Key $_.Key -File $_.File
    }

    # --- Службы, которые должны работать -------------------------------------
    Protect-NeededServices

    # --- Телеметрия и диагностика --------------------------------------------
    # Эти службы собирают статистику и пишут на диск. К Wi-Fi и видео они не нужны,
    # а на HDD как раз они часто дают фоновую нагрузку.
    Write-Host ""
    Write-Host "Телеметрия и диагностика" -ForegroundColor Cyan
    @(
        "DiagTrack",
        "dmwappushservice",
        "diagnosticshub.standardcollector.service",
        "WerSvc",
        "wercplsupport",
        "WdiServiceHost",
        "WdiSystemHost",
        "DPS",
        "PcaSvc",
        "diagsvc",
        "pla",
        "wmiApSrv"
    ) | ForEach-Object { Disable-ExtraService -Name $_ }

    # --- Печать и факс -------------------------------------------------------
    # Для кино принтер не нужен. Если позже понадобится печать или «печать в PDF»,
    # верните службу Spooler: services.msc -> тип запуска «Автоматически».
    Write-Host ""
    Write-Host "Печать и факс" -ForegroundColor Cyan
    @(
        "Spooler",
        "PrintNotify",
        "Fax",
        "PrintWorkflowUserSvc_*",
        "StiSvc",
        "WiaRpc"
    ) | ForEach-Object { Disable-ExtraService -Name $_ }

    # --- Удалённый доступ ----------------------------------------------------
    # Удалённый рабочий стол, помощь и VPN-сервер этому ПК не нужны.
    # Обычный домашний Wi-Fi от этого не зависит (Eaphost для сетей предприятия оставлен).
    Write-Host ""
    Write-Host "Удалённый доступ" -ForegroundColor Cyan
    @(
        "RemoteAccess",
        "RemoteRegistry",
        "RasAuto",
        "RasMan",
        "SessionEnv",
        "TermService",
        "UmRdpService",
        "RpcLocator",
        "WinRM",
        "SharedAccess",
        "icssvc",
        "SstpSvc",
        "IKEEXT",
        "PolicyAgent",
        "seclogon",
        "ssh-agent"
    ) | ForEach-Object { Disable-ExtraService -Name $_ }

    # --- Xbox, игры, смешанная реальность ------------------------------------
    Write-Host ""
    Write-Host "Xbox и игровые фоновые службы" -ForegroundColor Cyan
    @(
        "XblAuthManager",
        "XblGameSave",
        "XboxGipSvc",
        "XboxNetApiSvc",
        "BcastDVRUserService_*"
    ) | ForEach-Object { Disable-ExtraService -Name $_ }

    # --- Геолокация, датчики, лишние устройства ------------------------------
    Write-Host ""
    Write-Host "Геолокация, датчики, смарт-карты" -ForegroundColor Cyan
    @(
        "lfsvc",
        "MapsBroker",
        "SensorDataService",
        "SensorService",
        "SensrSvc",
        "RetailDemo",
        "WbioSrvc",
        "SCardSvr",
        "SCPolicySvc",
        "ScDeviceEnum",
        "CertPropSvc",
        "NaturalAuthentication",
        "NgcSvc",
        "NgcCtnrSvc",
        "TabletInputService",
        "FrameServer",
        "WwanSvc"
    ) | ForEach-Object { Disable-ExtraService -Name $_ }

    # --- Обнаружение сети и раздача папок ------------------------------------
    # Браузеру нужен интернет, а не общие папки, UPnP и сетевое обнаружение.
    # Клиент SMB (LanmanWorkstation) оставлен в ручном режиме ниже: сеть Windows
    # иногда сама его вызывает, и жёсткое отключение ломает некоторые окна системы.
    Write-Host ""
    Write-Host "Сетевое обнаружение и общие ресурсы" -ForegroundColor Cyan
    @(
        "SSDPSRV",
        "upnphost",
        "fdPHost",
        "FDResPub",
        "lltdsvc",
        "LanmanServer",
        "TrkWks",
        "WebClient",
        "Netlogon",
        "WMPNetworkSvc",
        "wcncsvc",
        "Wecsvc",
        "SNMPTRAP",
        "p2pimsvc",
        "p2psvc",
        "PNRPsvc",
        "PNRPAutoReg",
        "PeerDistSvc",
        "NetTcpPortSharing",
        "NcdAutoSetup",
        "CscService"
    ) | ForEach-Object { Disable-ExtraService -Name $_ }

    Set-ManualService -Name "LanmanWorkstation"
    Set-ManualService -Name "dot3svc"
    Set-ManualService -Name "iphlpsvc"
    Set-ManualService -Name "lmhosts"

    # --- Поиск и Superfetch --------------------------------------------------
    # На HDD это главные источники ступора. Индексация и Superfetch читают диск
    # в случайных местах ровно тогда, когда браузер пишет кэш и файл подкачки.
    # Загрузка станет чуть дольше, воспроизведение — ровнее.
    # Плановая дефрагментация (defragsvc) НЕ отключается: жёсткому диску она нужна,
    # но пусть идёт по расписанию, а не во время фильма.
    Write-Host ""
    Write-Host "Индексация и Superfetch" -ForegroundColor Cyan
    @(
        "WSearch",
        "SysMain"
    ) | ForEach-Object { Disable-ExtraService -Name $_ }

    # --- Фоновые службы пользователя -----------------------------------------
    # Контакты, визитки, буфер обмена между устройствами, всплывающие советы.
    # К ролику в браузере отношения не имеют. Bluetooth-службы пользователя не трогаем.
    Write-Host ""
    Write-Host "Фоновые пользовательские службы" -ForegroundColor Cyan
    @(
        "CDPSvc",
        "CDPUserSvc_*",
        "WpnService",
        "WpnUserSvc_*",
        "MessagingService_*",
        "PimIndexMaintenanceSvc_*",
        "OneSyncSvc_*",
        "DevicesFlowUserSvc_*",
        "DevicePickerUserSvc_*",
        "CaptureService_*",
        "ConsentUxUserSvc_*",
        "cbdhsvc_*",
        "CredentialEnrollmentManagerUserSvc_*",
        "UnistoreSvc_*",
        "UserDataSvc_*",
        "UdkUserSvc_*",
        "AarSvc_*",
        "PhoneSvc",
        "WalletService",
        "WpcMonSvc",
        "wisvc",
        "DmEnrollmentSvc",
        "PushToInstall",
        "AssignedAccessManagerSvc",
        "DialogBlockingService",
        "DispBrokerDesktopSvc",
        "DisplayEnhancementService",
        "GraphicsPerfSvc",
        "MixedRealityOpenXRSvc",
        "perceptionsimulation",
        "spectrum",
        "WEPHOSTSVC",
        "WarpJITSvc",
        "fhsvc",
        "SDRSVC",
        "wbengine",
        "workfolderssvc",
        "SmsRouter",
        "EntAppSvc",
        "HvHost",
        "vmickvpexchange",
        "vmicguestinterface",
        "vmicshutdown",
        "vmicheartbeat",
        "vmicvmsession",
        "vmicrdv",
        "vmictimesync",
        "vmicvss",
        "vmcompute",
        "vmms",
        "MSiSCSI",
        "MSDTC",
        "KtmRm",
        "smphost",
        "svsvc",
        "TieringEngineService",
        "AppVClient",
        "AppMgmt",
        "AxInstSV",
        "ALG",
        "AJRouter",
        "shpamsvc",
        "NcaSvc"
    ) | ForEach-Object { Disable-ExtraService -Name $_ }

    # --- Обновления Windows --------------------------------------------------
    # Полностью гасить обновления нельзя: старый Windows 10 в интернете без заплаток
    # быстро становится опасным, а браузер как раз ходит в интернет.
    # Службы переведены в «Вручную», политика — «сообщать перед загрузкой»,
    # без автоматической перезагрузки, пока кто-то вошёл в систему.
    # Раз в месяц, когда фильм не смотрите, откройте Параметры -> Обновление и безопасность.
    # Права на службу WaaSMedicSvc не меняем: захват владельца легко ломает обслуживание системы.
    Write-Host ""
    Write-Host "Обновления Windows (не выключаем, только убираем автозапуск)" -ForegroundColor Cyan
    @(
        "wuauserv",
        "UsoSvc",
        "BITS",
        "DoSvc"
    ) | ForEach-Object { Set-ManualService -Name $_ }

    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoUpdate" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "AUOptions" -Value 2
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" -Name "NoAutoRebootWithLoggedOnUsers" -Value 1
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DeliveryOptimization" -Name "DODownloadMode" -Value 0

    # --- Задачи планировщика -------------------------------------------------
    # Только телеметрия, карты, оценка производительности и сбор статистики диска.
    # Проверку здоровья HDD (DiskDiagnosticResolver), дефрагментацию и Защитник не трогаем.
    # Задачи Центра обновления тоже оставляем: иначе заплатки потом не поставить штатно.
    Write-Host ""
    Write-Host "Лишние задания планировщика" -ForegroundColor Cyan
    $scheduler = Get-Service -Name "Schedule" -ErrorAction SilentlyContinue
    if ($scheduler -and $scheduler.Status -ne "Running") {
        Set-ServiceStartupSafe -Name "Schedule" -StartupType Automatic | Out-Null
        & sc.exe start Schedule | Out-Null
    }
    @(
        "\Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser",
        "\Microsoft\Windows\Application Experience\ProgramDataUpdater",
        "\Microsoft\Windows\Application Experience\StartupAppTask",
        "\Microsoft\Windows\Application Experience\PcaPatchDbTask",
        "\Microsoft\Windows\Application Experience\MareBackup",
        "\Microsoft\Windows\Autochk\Proxy",
        "\Microsoft\Windows\Customer Experience Improvement Program\Consolidator",
        "\Microsoft\Windows\Customer Experience Improvement Program\UsbCeip",
        "\Microsoft\Windows\Customer Experience Improvement Program\KernelCeipTask",
        "\Microsoft\Windows\DiskDiagnostic\Microsoft-Windows-DiskDiagnosticDataCollector",
        "\Microsoft\Windows\Feedback\Siuf\DmClient",
        "\Microsoft\Windows\Feedback\Siuf\DmClientOnScenarioDownload",
        "\Microsoft\Windows\Maps\MapsToastTask",
        "\Microsoft\Windows\Maps\MapsUpdateTask",
        "\Microsoft\Windows\Windows Error Reporting\QueueReporting",
        "\Microsoft\Windows\Windows Error Reporting\PrivacyConsentStatusTask",
        "\Microsoft\Windows\CloudExperienceHost\CreateObjectTask",
        "\Microsoft\Windows\Diagnosis\Scheduled",
        "\Microsoft\Windows\Maintenance\WinSAT",
        "\Microsoft\Windows\Shell\FamilySafetyMonitor",
        "\Microsoft\Windows\Shell\FamilySafetyRefresh",
        "\Microsoft\Windows\Shell\FamilySafetyUpload",
        "\Microsoft\Windows\DiskFootprint\Diagnostics",
        "\Microsoft\Windows\NetTrace\GatherNetworkInfo",
        "\Microsoft\Windows\PI\Sqm-Tasks",
        "\Microsoft\Windows\Power Efficiency Diagnostics\AnalyzeSystem",
        "\Microsoft\Windows\Speech\SpeechModelDownloadTask",
        "\Microsoft\Windows\HelloFace\FODCleanupTask",
        "\Microsoft\Windows\FileHistory\File History (maintenance mode)",
        "\Microsoft\Windows\Sysmain\ResPriStaticDbTask",
        "\Microsoft\Windows\Sysmain\WsSwapAssessmentTask"
    ) | ForEach-Object {
        $taskName = ($_ -split "\\")[-1]
        $taskPath = $_.Substring(0, $_.LastIndexOf("\") + 1)
        try {
            Disable-ScheduledTask -TaskName $taskName -TaskPath $taskPath -ErrorAction Stop | Out-Null
            Write-Host "  [задача выкл] $_" -ForegroundColor Green
        }
        catch {
            Write-Host "  [задача не найдена или занята] $_" -ForegroundColor DarkGray
        }
    }

    # --- Визуальные эффекты --------------------------------------------------
    # Анимации и прозрачность на этом процессоре отнимают кадры у видео.
    # ClearType (сглаживание шрифтов) оставляем: субтитры должны читаться.
    # Значки проводника не прячем — браузер ещё нужно найти и запустить.
    Write-Host ""
    Write-Host "Визуальные эффекты" -ForegroundColor Cyan
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects" -Name "VisualFXSetting" -Value 2
    Set-RegString -Path "HKCU:\Control Panel\Desktop" -Name "DragFullWindows" -Value "0"
    Set-RegString -Path "HKCU:\Control Panel\Desktop" -Name "FontSmoothing" -Value "2"
    Set-RegString -Path "HKCU:\Control Panel\Desktop" -Name "MenuShowDelay" -Value "100"
    # Маска «наилучшее быстродействие»: анимации выключены, шрифты остаются сглаженными.
    New-ItemProperty -LiteralPath "HKCU:\Control Panel\Desktop" -Name "UserPreferencesMask" -PropertyType Binary -Value ([byte[]](0x90, 0x12, 0x03, 0x80, 0x10, 0x00, 0x00, 0x00)) -Force | Out-Null
    Set-RegString -Path "HKCU:\Control Panel\Desktop\WindowMetrics" -Name "MinAnimate" -Value "0"
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "TaskbarAnimations" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ListviewAlphaSelect" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced" -Name "ListviewShadow" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize" -Name "EnableTransparency" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\DWM" -Name "EnableAeroPeek" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Serialize" -Name "StartupDelayInMSec" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\PushNotifications" -Name "ToastEnabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Feeds" -Name "ShellFeedsTaskbarViewMode" -Value 2
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name "HideSCAMeetNow" -Value 1
    Set-RegDword -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer" -Name "HideSCAMeetNow" -Value 1
    # Старый планировщик GPU на HD 8210 только мешает. Значение 1 — выключено.
    Set-RegDword -Path "HKLM:\SYSTEM\CurrentControlSet\Control\GraphicsDrivers" -Name "HwSchMode" -Value 1

    # --- Память и жёсткий диск -----------------------------------------------
    # 4 ГБ легко уходят в ноль, если Windows ещё и сжимает память процессором.
    # E1-2100 дешевле отдать кадры видео, чем тратить их на сжатие.
    # Prefetch/Superfetch выключены по той же причине, что и служба SysMain.
    Write-Host ""
    Write-Host "Память и жёсткий диск" -ForegroundColor Cyan
    try {
        Disable-MMAgent -MemoryCompression -ErrorAction Stop
        Write-Host "  [ок] Сжатие памяти выключено." -ForegroundColor Green
    }
    catch {
        Write-Warning "  Сжатие памяти не изменилось: $($_.Exception.Message)"
    }
    try {
        Disable-MMAgent -PageCombining -ErrorAction Stop
        Write-Host "  [ок] Объединение страниц памяти выключено." -ForegroundColor Green
    }
    catch {
        Write-Warning "  Объединение страниц не изменилось: $($_.Exception.Message)"
    }

    $prefetch = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters"
    Set-RegDword -Path $prefetch -Name "EnablePrefetcher" -Value 0
    Set-RegDword -Path $prefetch -Name "EnableSuperfetch" -Value 0

    # Больше оперативки под кэш файловой системы не отдаём: её и так 4 ГБ.
    & fsutil.exe behavior set memoryusage 1 | Out-Null
    # Не обновлять время последнего доступа к каждому файлу — меньше мелких записей на HDD.
    & fsutil.exe behavior set disablelastaccess 1 | Out-Null
    Write-Host "  [ок] Лишние записи NTFS по времени доступа отключены." -ForegroundColor Green

    # Активному окну (браузеру) отдаём процессор раньше, чем фоновым службам.
    Set-RegDword -Path "HKLM:\SYSTEM\CurrentControlSet\Control\PriorityControl" -Name "Win32PrioritySeparation" -Value 38

    Set-FixedPageFile

    # Гибернация на HDD занимает примерно объём RAM и пишет большой файл.
    # Быстрый запуск при этом тоже выключится: загрузка станет чуть дольше, диск — свободнее.
    & powercfg.exe -h off | Out-Null
    Set-RegDword -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Power" -Name "HiberbootEnabled" -Value 0
    Write-Host "  [ок] Гибернация и быстрый запуск выключены." -ForegroundColor Green

    # --- Электропитание ------------------------------------------------------
    # На E1-2100 выигрыш не в «разгоне» (выше 1 ГГц он почти не бывает), а в том,
    # чтобы Wi-Fi, USB и жёсткий диск не засыпали посреди потока.
    # Пробуждение HDD из сна — это несколько секунд замершего кадра.
    Write-Host ""
    Write-Host "План электропитания" -ForegroundColor Cyan
    $highGuid = "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c"
    $schemes = & powercfg.exe /L
    if ($schemes -notmatch $highGuid) {
        & powercfg.exe -duplicatescheme $highGuid | Out-Null
    }
    & powercfg.exe -setactive $highGuid | Out-Null
    Write-Host "  [ок] Включён план «Высокая производительность»." -ForegroundColor Green

    & powercfg.exe -change -monitor-timeout-ac 20 | Out-Null
    & powercfg.exe -change -monitor-timeout-dc 10 | Out-Null
    & powercfg.exe -change -standby-timeout-ac 0 | Out-Null
    & powercfg.exe -change -standby-timeout-dc 0 | Out-Null
    & powercfg.exe -change -hibernate-timeout-ac 0 | Out-Null
    & powercfg.exe -change -hibernate-timeout-dc 0 | Out-Null
    & powercfg.exe -change -disk-timeout-ac 0 | Out-Null
    & powercfg.exe -change -disk-timeout-dc 0 | Out-Null

    & powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT SUB_DISK DISKIDLE 0 | Out-Null
    & powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT SUB_DISK DISKIDLE 0 | Out-Null
    & powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT SUB_SLEEP HYBRIDSLEEP 0 | Out-Null
    & powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT SUB_SLEEP HYBRIDSLEEP 0 | Out-Null
    & powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT SUB_PCIEXPRESS ASPM 0 | Out-Null
    & powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT SUB_PCIEXPRESS ASPM 0 | Out-Null
    & powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMIN 100 | Out-Null
    & powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMIN 100 | Out-Null
    & powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMAX 100 | Out-Null
    & powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT SUB_PROCESSOR PROCTHROTTLEMAX 100 | Out-Null
    & powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT SUB_PROCESSOR SYSCOOLPOL 1 | Out-Null
    & powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT SUB_PROCESSOR SYSCOOLPOL 1 | Out-Null

    # 0 = максимальная производительность беспроводного адаптера (и от сети, и от батареи).
    $wifiSub = "19cbb8fa-5279-450e-9fac-8a3d5fedd0c1"
    $wifiPwr = "12bbebe6-58d6-4636-95bb-3217ef867c1a"
    & powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT $wifiSub $wifiPwr 0 | Out-Null
    & powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT $wifiSub $wifiPwr 0 | Out-Null

    # Выборочная приостановка USB тоже умеет «проваливать» кадр на старых контроллерах.
    $usbSub = "2a737441-1930-4402-8d77-b2bebba308a3"
    $usbSus = "48e6b7a6-50f5-4782-a5d4-53bb8f07e226"
    & powercfg.exe -SETACVALUEINDEX SCHEME_CURRENT $usbSub $usbSus 0 | Out-Null
    & powercfg.exe -SETDCVALUEINDEX SCHEME_CURRENT $usbSub $usbSus 0 | Out-Null
    & powercfg.exe -setactive $highGuid | Out-Null
    Write-Host "  [ок] Диск, Wi-Fi и USB не уходят в энергосбережение." -ForegroundColor Green

    # --- Автозагрузка --------------------------------------------------------
    # Записи Run не удаляем: в диспетчере задач их можно включить обратно.
    # Ярлыки из папок автозагрузки переносятся в backup\startup-shortcuts, не в корзину навсегда.
    # RunOnce не трогаем — там часто лежит хвост установки программы, его нельзя срывать.
    Write-Host ""
    Write-Host "Автозагрузка" -ForegroundColor Cyan
    Disable-StartupRunKey -RunKey "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -ApprovedKey "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run"
    Disable-StartupRunKey -RunKey "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run" -ApprovedKey "HKLM:\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run"
    Disable-StartupRunKey -RunKey "HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Run" -ApprovedKey "HKLM:\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run32"

    $userStartup = [Environment]::GetFolderPath("Startup")
    $commonStartup = Join-Path $env:ProgramData "Microsoft\Windows\Start Menu\Programs\Startup"
    Suspend-StartupFolder -SourceFolder $userStartup -BackupFolder (Join-Path $script:BackupDir "startup-shortcuts\user")
    Suspend-StartupFolder -SourceFolder $commonStartup -BackupFolder (Join-Path $script:BackupDir "startup-shortcuts\common")

    # OneDrive только перестаёт синхронизироваться. Файлы в папке пользователя остаются.
    Get-Process -Name "OneDrive" -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\OneDrive" -Name "DisableFileSyncNGSC" -Value 1
    Write-Host "  [ок] Синхронизация OneDrive отключена, файлы не удалялись." -ForegroundColor Green

    # --- Лишний интерфейс и телеметрия в политиках ---------------------------
    Write-Host ""
    Write-Host "Советы, фоновые приложения, телеметрия" -ForegroundColor Cyan
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SystemPaneSuggestionsEnabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SoftLandingEnabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-338388Enabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-338389Enabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-353694Enabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SubscribedContent-353696Enabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\ContentDeliveryManager" -Name "SilentInstalledAppsEnabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\BackgroundAccessApplications" -Name "GlobalUserDisabled" -Value 1
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\AdvertisingInfo" -Name "Enabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search" -Name "BingSearchEnabled" -Value 0
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Search" -Name "CortanaConsent" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search" -Name "AllowCortana" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search" -Name "AllowSearchToUseLocation" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search" -Name "DisableWebSearch" -Value 1
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Windows Search" -Name "ConnectedSearchUseWeb" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\DataCollection" -Name "AllowTelemetry" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AppCompat" -Name "AITEnable" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\AppCompat" -Name "DisableUAR" -Value 1
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\SQMClient\Windows" -Name "CEIPEnable" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "EnableActivityFeed" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "PublishUserActivities" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\System" -Name "UploadUserActivities" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Name "DisableSoftLanding" -Value 1
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\CloudContent" -Name "DisableWindowsConsumerFeatures" -Value 1

    # Игровая панель пишет видео на диск и на этом ПК только мешает.
    Set-RegDword -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\GameDVR" -Name "AppCaptureEnabled" -Value 0
    Set-RegDword -Path "HKCU:\System\GameConfigStore" -Name "GameDVR_Enabled" -Value 0
    Set-RegDword -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\GameDVR" -Name "AllowGameDVR" -Value 0

    # --- Мультимедиа ---------------------------------------------------------
    # SystemResponsiveness = 10 означает: 10% CPU оставить системе, остальное можно отдать
    # потокам аудио и видео. Ноль не ставим — на двух ядрах сеть тоже должна успевать.
    # NetworkThrottlingIndex = максимум отключает встроенное урезание скорости мультимедиа.
    Write-Host ""
    Write-Host "Приоритет звука и видео" -ForegroundColor Cyan
    $mmcss = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile"
    Set-RegDword -Path $mmcss -Name "SystemResponsiveness" -Value 10
    if (-not (Test-Path -LiteralPath $mmcss)) {
        New-Item -Path $mmcss -Force | Out-Null
    }
    New-ItemProperty -LiteralPath $mmcss -Name "NetworkThrottlingIndex" -PropertyType DWord -Value ([uint32]::MaxValue) -Force | Out-Null

    foreach ($taskName in @("Audio", "Playback")) {
        $taskPath = Join-Path $mmcss "Tasks\$taskName"
        if (Test-Path -LiteralPath $taskPath) {
            Set-RegString -Path $taskPath -Name "Scheduling Category" -Value "High"
            Set-RegString -Path $taskPath -Name "SFIO Priority" -Value "High"
            Set-RegDword -Path $taskPath -Name "Priority" -Value 6
            Write-Host "  [ок] Повышена важность потока $taskName" -ForegroundColor Green
        }
    }

    # --- Защитник Windows: не выключаем, только снижаем цену проверки --------
    # Полное отключение защиты на компьютере, который ходит в интернет, здесь не делается.
    # Исключаем лишь кэш браузера: он всё равно перезаписывается и сильно дёргает HDD.
    # Документы и загрузки по-прежнему проверяются.
    Write-Host ""
    Write-Host "Защитник Windows (остаётся включённым)" -ForegroundColor Cyan
    try {
        Import-Module Defender -ErrorAction Stop
        Set-MpPreference -ScanAvgCPULoadFactor 5 -ErrorAction SilentlyContinue
        Set-MpPreference -EnableLowCpuPriority $true -ErrorAction SilentlyContinue

        $cachePaths = @(
            (Join-Path $env:LOCALAPPDATA "Google\Chrome\User Data\Default\Cache"),
            (Join-Path $env:LOCALAPPDATA "Google\Chrome\User Data\Default\Code Cache"),
            (Join-Path $env:LOCALAPPDATA "Google\Chrome\User Data\ShaderCache"),
            (Join-Path $env:LOCALAPPDATA "Microsoft\Edge\User Data\Default\Cache"),
            (Join-Path $env:LOCALAPPDATA "Microsoft\Edge\User Data\Default\Code Cache"),
            (Join-Path $env:LOCALAPPDATA "Microsoft\Edge\User Data\ShaderCache")
        )
        $ffProfiles = Join-Path $env:LOCALAPPDATA "Mozilla\Firefox\Profiles"
        if (Test-Path -LiteralPath $ffProfiles) {
            Get-ChildItem -LiteralPath $ffProfiles -Directory -ErrorAction SilentlyContinue | ForEach-Object {
                $cachePaths += (Join-Path $_.FullName "cache2")
            }
        }
        foreach ($cachePath in $cachePaths) {
            try {
                Add-MpPreference -ExclusionPath $cachePath -ErrorAction Stop
                Write-Host "  [исключён кэш] $cachePath" -ForegroundColor Green
            }
            catch {
                Write-Host "  [кэш уже исключён или недоступен] $cachePath" -ForegroundColor DarkGray
            }
        }
    }
    catch {
        Write-Warning "  Параметры Защитника не изменены: $($_.Exception.Message)"
    }

    # Повторная проверка на случай, если остановка какой-то службы потянула за собой звук или Wi-Fi.
    Write-Host ""
    Write-Host "Повторная проверка звука и сети" -ForegroundColor Cyan
    Protect-NeededServices

    Write-Host ""
    Write-Host "Готово. Выключено служб (вместе с вариантами имён): $($script:DisabledOk). Не удалось: $($script:DisabledFail)." -ForegroundColor Green
    Write-Host "Перезагрузите компьютер, когда будет удобно. Сам скрипт перезагрузку не запускает." -ForegroundColor Yellow
    Write-Host "Откат: .\Optimize-MoviePC.ps1 -Restore" -ForegroundColor Yellow
    Write-Host "Раз в месяц, не во время фильма, имеет смысл дефрагментировать диск: defrag $env:SystemDrive /O" -ForegroundColor Yellow

    Write-Host ""
    Write-Host "Браузер для этого железа" -ForegroundColor Cyan
    Write-Host @"
Ставьте Mozilla Firefox: https://www.mozilla.org/firefox/
На E1-2100 и 4 ГБ RAM он обычно легче Chrome и Edge.

Radeon HD 8210 аппаратно декодирует H.264 и не умеет VP9/AV1.
Поставьте расширение h264ify, иначе YouTube отдаст VP9 и ролик будет считать процессор.
Смотрите в 720p, включите аппаратное ускорение, поставьте uBlock Origin
и не держите вторую тяжёлую программу рядом с фильмом.

Подробнее: $(Join-Path $PSScriptRoot "browser-recommendation.txt")
"@
}
finally {
    try { Stop-Transcript | Out-Null } catch { }
}

# =============================================================================
# Браузер (кратко, чтобы совет остался прямо в скрипте)
#
# Лучший вариант для AMD E1-2100 / 4 ГБ / HDD — Mozilla Firefox.
# Chrome и Edge на нескольких вкладках съедают гигабайт и больше, после чего
# Windows активно листает файл подкачки на жёстком диске и кадр замирает.
#
# Обязательно расширение h264ify или enhanced-h264ify.
# Видеоядро HD 8210 тянет H.264. VP9 и AV1 идут программно и заикаются даже в 480p.
# Разрешение для этого ПК — 720p. Аппаратное ускорение в браузере должно быть включено.
# uBlock Origin убирает рекламу, которая на двух ядрах по 1 ГГц сама по себе роняет кадр.
# Одна вкладка с видео. Не запускайте Chrome и Firefox одновременно.
# =============================================================================

Как откатить изменения (-Restore)

В той же папке (рядом должна лежать папка backup\) выполните от имени администратора:

.\Optimize-MoviePC.ps1 -Restore

Скрипт вернёт типы запуска служб из services-before.csv (без их перезапуска), импортирует сохранённые копии реестра, вернёт ярлыки автозагрузки и попросит перезагрузиться. Если папки backup\ нет, он предложит воспользоваться точкой восстановления системы.

Что -Restore не возвращает: сжатие памяти, гибернацию, план электропитания, файл подкачки (только частично), отключённые задачи планировщика (остаются отключёнными), настройки fsutil; процесс OneDrive не перезапускается. Часть можно вернуть вручную:

powercfg -h on
Enable-MMAgent -MemoryCompression -PageCombining

Полный откат — через созданную точку восстановления системы.

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

  • Mozilla Firefox. Chrome и Edge с несколькими вкладками часто занимают 1–1,5 ГБ памяти; вместе с Windows из 4 ГБ ничего не остаётся, начинается подкачка на HDD и кадр замирает. Firefox с 1–2 вкладками обычно расходует меньше.
  • Расширение h264ify (или enhanced-h264ify) для YouTube. Radeon HD 8210 аппаратно декодирует H.264, но не умеет VP9/AV1. Без расширения VP9 декодирует процессор, и картинка сыпется даже в 480p.
  • Аппаратное ускорение — включите в Настройки → Производительность.
  • 720p — 1080p такое железо часто не тянет.
  • uBlock Origin — реклама означает лишний JavaScript и рывки.
  • Одна вкладка; не запускайте Chrome и Firefox одновременно. Если нужен именно Chromium — один Chrome или Edge + enhanced-h264ify + uBlock Origin, одна вкладка 720p, но запас будет хуже, чем у Firefox.

Реалистичный потолок такого компьютера для телевизора: один фильм 720p в H.264, Wi-Fi без энергосбережения адаптера, без загрузок и обновлений в фоне.

Итог

Оптимизация старого компьютера не сделает из него игровую станцию, но слабый ПК для мультимедиа вполне реален: облегчённая Windows 10, правильный браузер и кодек H.264 позволяют смотреть фильмы и YouTube на телевизоре без лишних трат.

Нужна помощь с техникой посерьёзнее? Команда crmgo.eu настраивает сайты и серверы, переносит проекты, занимается SEO-продвижением и автоматизацией бизнеса с CRM. Оставьте заявку на crmgo.eu — подскажем и сделаем.

Примечание: материал мог быть создан с помощью ИИ и затем отредактирован человеком. Ответственный: Dmytro Lomaka, Kaltenkirchen.