forked from ScoopInstaller/Scoop
-
Notifications
You must be signed in to change notification settings - Fork 0
/
uninstall.ps1
107 lines (90 loc) · 2.99 KB
/
uninstall.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<#
.SYNOPSIS
Uninstall ALL scoop applications and scoop itself.
.PARAMETER global
Global applications will be uninstalled.
.PARAMETER purge
Persisted data will be deleted.
#>
param(
[bool] $global,
[bool] $purge
)
. "$PSScriptRoot\..\lib\core.ps1"
. "$PSScriptRoot\..\lib\system.ps1"
. "$PSScriptRoot\..\lib\install.ps1"
. "$PSScriptRoot\..\lib\shortcuts.ps1"
. "$PSScriptRoot\..\lib\versions.ps1"
. "$PSScriptRoot\..\lib\manifest.ps1"
if ($global -and !(is_admin)) {
error 'You need admin rights to uninstall globally.'
exit 1
}
if ($purge) {
warn 'This will uninstall Scoop, all the programs that have been installed with Scoop and all persisted data!'
} else {
warn 'This will uninstall Scoop and all the programs that have been installed with Scoop!'
}
$yn = Read-Host 'Are you sure? (yN)'
if ($yn -notlike 'y*') { exit }
$errors = $false
# Uninstall given app
function do_uninstall($app, $global) {
$version = Select-CurrentVersion -AppName $app -Global:$global
$dir = versiondir $app $version $global
$manifest = installed_manifest $app $version $global
$install = install_info $app $version $global
$architecture = $install.architecture
Write-Output "Uninstalling '$app'"
Invoke-Installer -Path $dir -Manifest $manifest -ProcessorArchitecture $architecture -Uninstall
rm_shims $app $manifest $global $architecture
# If a junction was used during install, that will have been used
# as the reference directory. Othewise it will just be the version
# directory.
$refdir = unlink_current (appdir $app $global)
env_rm_path $manifest $refdir $global $architecture
env_rm $manifest $global $architecture
$appdir = appdir $app $global
try {
Remove-Item $appdir -Recurse -Force -ErrorAction Stop
} catch {
$errors = $true
warn "Couldn't remove $(friendly_path $appdir): $_.Exception"
}
}
function rm_dir($dir) {
try {
Remove-Item $dir -Recurse -Force -ErrorAction Stop
} catch {
abort "Couldn't remove $(friendly_path $dir): $_"
}
}
# Remove all folders (except persist) inside given scoop directory.
function keep_onlypersist($directory) {
Get-ChildItem $directory -Exclude 'persist' | ForEach-Object { rm_dir $_ }
}
# Run uninstallation for each app if necessary, continuing if there's
# a problem deleting a directory (which is quite likely)
if ($global) {
installed_apps $true | ForEach-Object { # global apps
do_uninstall $_ $true
}
}
installed_apps $false | ForEach-Object { # local apps
do_uninstall $_ $false
}
if ($errors) {
abort 'Not all apps could be deleted. Try again or restart.'
}
if ($purge) {
rm_dir $scoopdir
if ($global) { rm_dir $globaldir }
} else {
keep_onlypersist $scoopdir
if ($global) { keep_onlypersist $globaldir }
}
Remove-Path -Path (shimdir $global) -Global:$global
if (get_config USE_ISOLATED_PATH) {
Remove-Path -Path ('%' + $scoopPathEnvVar + '%') -Global:$global
}
success 'Scoop has been uninstalled.'