Практика / рабочие места

Как применять материал

Материал стоит воспринимать как короткий runbook: сначала сохранить рабочее состояние, затем проверить симптом, выполнить минимально достаточное исправление и зафиксировать результат. Так единичная проблема не превращается в бесконечную переписку.

01 Симптом
02 Диагностика
03 Исправление
04 Контроль

Практический порядок

  1. сначала закрыть WhatsApp и сделать резервную копию важных чатов/файлов, если они нужны
  2. запустить скрипт в режиме WhatIf и посмотреть, какие объекты он нашел
  3. для реального удаления повторить запуск с WhatIfMode=false и включать удаление пользовательских данных только осознанно
  4. после удаления перезагрузить Windows и проверить Проводник, автозагрузку и список установленных приложений

Безопасный PowerShell-скрипт удаления WhatsApp

Совместимость: Windows 10/11; PowerShell 5.1 или PowerShell 7; Store/MSIX и классическая Desktop-версия WhatsApp. Для machine-wide папок могут понадобиться права администратора.

Сначала запустите без параметров: это dry-run. Для реального удаления используйте `-WhatIfMode $false`; пользовательские данные и реестр включайте отдельными параметрами только после резервной копии.

<#
Удаление WhatsApp Desktop с Windows.

По умолчанию работает в безопасном режиме WhatIf: показывает, что будет сделано,
но не удаляет файлы. Для реального удаления запустите с -WhatIfMode $false.
#>

[CmdletBinding()]
param(
    [bool]$WhatIfMode = $true,
    [bool]$RemoveUserData = $false,
    [bool]$RemoveRegistryKeys = $false
)

$ErrorActionPreference = "Continue"

function Invoke-SafeRemove {
    param(
        [Parameter(Mandatory)][string]$Path,
        [switch]$Recurse
    )

    if (-not (Test-Path -LiteralPath $Path)) {
        Write-Host "Не найдено: $Path"
        return
    }

    if ($WhatIfMode) {
        Write-Host "[WhatIf] Будет удалено: $Path"
        return
    }

    Remove-Item -LiteralPath $Path -Force -Recurse:$Recurse -ErrorAction Stop
    Write-Host "Удалено: $Path"
}

Write-Host "Проверка запущенного WhatsApp..."
$runningProcesses = Get-Process -Name "WhatsApp" -ErrorAction SilentlyContinue
if ($WhatIfMode) {
    foreach ($process in $runningProcesses) {
        Write-Host "[WhatIf] Будет остановлен процесс: $($process.ProcessName) (PID $($process.Id))"
    }
} else {
    $runningProcesses | Stop-Process -Force -ErrorAction Continue
}

Write-Host "Удаление Store/MSIX-версии для текущего пользователя..."
$packages = Get-AppxPackage -Name "*WhatsApp*" -ErrorAction SilentlyContinue
foreach ($package in $packages) {
    if ($WhatIfMode) {
        Write-Host "[WhatIf] Remove-AppxPackage: $($package.PackageFullName)"
    } else {
        Remove-AppxPackage -Package $package.PackageFullName -ErrorAction Continue
    }
}

Write-Host "Проверка классических папок установки..."
$programFilesX86 = [Environment]::GetFolderPath(
    [Environment+SpecialFolder]::ProgramFilesX86
)
$machinePaths = @($env:ProgramFiles, $programFilesX86) |
    Where-Object { $_ } |
    ForEach-Object { Join-Path $_ "WhatsApp" } |
    Select-Object -Unique

foreach ($path in $machinePaths) {
    Invoke-SafeRemove -Path $path -Recurse
}

if ($RemoveUserData) {
    Write-Host "Удаление пользовательских данных включено."
    $userPaths = @(
        (Join-Path $env:LocalAppData "WhatsApp"),
        (Join-Path $env:AppData "WhatsApp"),
        (Join-Path $env:LocalAppData "Packages")
    )

    foreach ($path in $userPaths) {
        if ($path -like "*\Packages") {
            Get-ChildItem -LiteralPath $path -Directory -Filter "*WhatsApp*" -ErrorAction SilentlyContinue |
                ForEach-Object { Invoke-SafeRemove -Path $_.FullName -Recurse }
        } else {
            Invoke-SafeRemove -Path $path -Recurse
        }
    }
} else {
    Write-Host "Пользовательские данные не удаляются. Для удаления добавьте -RemoveUserData $true."
}

if ($RemoveRegistryKeys) {
    Write-Host "Удаление пользовательских ключей реестра включено."
    Invoke-SafeRemove -Path "HKCU:\Software\WhatsApp" -Recurse
} else {
    Write-Host "Реестр не очищается. Для очистки добавьте -RemoveRegistryKeys $true."
}

Write-Host "Готово. Если WhatIfMode=true, это был только предварительный просмотр."

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

Что проверить перед внедрением

  • режим WhatIf включен по умолчанию и ничего не удаляет без явного параметра
  • пользовательские данные и реестр удаляются только отдельными флагами
  • скрипт работает с конкретными путями через LiteralPath, без широких масок по диску
  • если приложение установлено из Microsoft Store, используется Remove-AppxPackage для текущего пользователя

Итог: приложение удалено чисто, автозапуск и остаточные данные проверены, пользовательский профиль не хранит лишний мусор.