-
Notifications
You must be signed in to change notification settings - Fork 0
/
condaremove.ps1
149 lines (135 loc) · 5.56 KB
/
condaremove.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
## CONFIGURATION
# directories that might contain conda install folder
$installdirs = $env:SystemDrive,$env:ProgramData,$env:USERPROFILE
# potential names of conda install folders
$condanames = "anaconda","miniconda","anaconda3","miniconda3","anaconda2","miniconda2"
# potential names of conda uninstallers
$uninstallers = "Uninstall-Anaconda.exe","Uninstall-Miniconda.exe","Uninstall-Anaconda3.exe","Uninstall-Miniconda3.exe","Uninstall-Anaconda2.exe","Uninstall-Miniconda2.exe"
# configuration files/folders to remove from %USERPROFILE%
$userconfigs = ".anaconda",".astropy",".continuum",".conda",".condamanager",".condarc",".enthought",".idlerc",".glue",".ipynb_checkpoints",".ipython",".jupyter",".matplotlib",".python-eggs",".spyder2",".spyder2-py3",".theano"
# configuration files/folders to remove from %APPDATA$
$appdataconfigs = ".anaconda","jupyter"
# configuration files/folders to remove from %ProgramData%
$programdataconfigs = "jupyter"
# registry keys to remove
$registykeys = "HKLM:\SOFTWARE\Python","HKCU:\SOFTWARE\Python"
# system environment regisrty
$systemenv = "HKLM:\System\CurrentControlSet\Control\Session Manager\Environment"
# user environment regisrty
$userenv = "HKCU:\Environment"
# start menu directories
$startdirs = (Join-Path $env:APPDATA "Microsoft\Windows\Start Menu\Programs"),(Join-Path $env:ProgramData "Microsoft\Windows\Start Menu\Programs")
# start menu conda directory names
$startcondanames = "Anaconda3 (64-bit)","Anaconda3 (32-bit)","Anaconda2 (64-bit)","Anaconda2 (32-bit)"
# separator string
$sep = "--------------------------------------------------------------------"
## HELPERS
function Get-Timestamp {return "[$(Get-Date -Format HH:mm:ss)]"}
function Write-TimestampedHost ($string) {
Write-Host "$(Get-Timestamp) $string"
}
function Remove-Object ($path) {
if (Test-Path $path) {
Write-TimestampedHost "Removing $path"
Remove-Item -Recurse -Force -Path $path
} else {
Write-TimestampedHost "Did not find $path"
}
}
function Remove-Objects ($list) {
foreach ($obj in $list) {
Remove-Object $obj
}
}
function Remove-ObjectsWithPrefix ($prefix, $list){
foreach ($obj in $list) {
Remove-Object (Join-Path $prefix $obj)
}
}
function Uninstall-Conda ($condaroot, $uninstallers) {
Write-TimestampedHost "Looking for uninstallers"
$success = $false
foreach ($exe in $uninstallers) {
$uninstaller = Join-Path $condaroot $exe
if (Test-Path $uninstaller) {
Write-TimestampedHost "Running uninstaller $uninstaller"
Start-Process $uninstaller -ArgumentList "/S" -Wait
Write-TimestampedHost "Finished running uninstaller"
$success = $true
Break
}
}
if (-Not $success) {
Write-TimestampedHost "No uninstaller found, attempting manual removal"
}
if (Test-Path $condaroot) {
Write-TimestampedHost "Removing $condaroot"
Remove-Item -Recurse -Force -Path $condaroot
if ($?) {
Write-TimestampedHost "Confirmed removal of $condaroot"
} else {
Write-TimestampedHost "[ERR] Unable to completely remove $condaroot"
}
} else {
Write-TimestampedHost "Confirmed removal of $condaroot"
}
}
function Assert-PathRemoval ($item, $pathtype, $installdirs, $condanames) {
if (Test-Path $item) {
foreach ($dir in $installdirs) {
foreach ($name in $condanames) {
if ((Join-Path (Resolve-Path $item) "\") -like (Join-Path (Join-Path $dir $name) "*")) {
Write-TimestampedHost "Removing $pathtype PATH entry $item"
return $true
}
}
}
} else {
Write-TimestampedHost "Removing $pathtype PATH entry $item"
return $true
}
return $false
}
function Remove-FromPath ($envreg, $pathtype, $installdirs, $condanames) {
$path = (Get-ItemProperty -Path $envreg -Name "PATH").path.trimEnd(";")
$newpath = ($path.Split(";") | Where-Object {-not (Assert-PathRemoval $_ $pathtype $installdirs $condanames)}) -join ";"
if ($path -eq $newpath) {
Write-TimestampedHost "Nothing to remove from $pathtype PATH"
} else {
Set-ItemProperty -Path $envreg -Name "PATH" -Value $newpath
}
}
## MAIN
Write-TimestampedHost "Checking for existing conda installations"
foreach ($dir in $installdirs) {
foreach ($name in $condanames) {
$condaroot = Join-Path $dir $name
if (Test-Path $condaroot) {
Write-TimestampedHost "Detected installation at $condaroot"
Remove-ObjectsWithPrefix $condaroot @("envs", "pkgs")
Uninstall-Conda $condaroot $uninstallers
} else {
Write-TimestampedHost "No installation found at $condaroot"
}
}
}
Write-TimestampedHost $sep
Write-TimestampedHost "Checking common configuration files"
Remove-ObjectsWithPrefix $env:USERPROFILE $userconfigs
Remove-ObjectsWithPrefix $env:APPDATA $appdataconfigs
Remove-ObjectsWithPrefix $env:ProgramData $programdataconfigs
Write-TimestampedHost $sep
Write-TimestampedHost "Checking registry keys"
Remove-Objects $registykeys
Write-TimestampedHost $sep
Write-TimestampedHost "Checking system and user PATH"
Remove-FromPath $systemenv "system" $installdirs $condanames
Remove-FromPath $userenv "user" $installdirs $condanames
Write-TimestampedHost $sep
Write-TimestampedHost "Checking start menu"
foreach ($dir in $startdirs) {
Remove-ObjectsWithPrefix $dir $startcondanames
}
Write-TimestampedHost $sep
Write-TimestampedHost "Best effort cleanup finished"
Write-TimestampedHost "DONE"