aboutsummaryrefslogtreecommitdiff
path: root/bootstrap-win
diff options
context:
space:
mode:
Diffstat (limited to 'bootstrap-win')
-rw-r--r--bootstrap-win/neovim.ps151
1 files changed, 49 insertions, 2 deletions
diff --git a/bootstrap-win/neovim.ps1 b/bootstrap-win/neovim.ps1
index 467463b..cc598de 100644
--- a/bootstrap-win/neovim.ps1
+++ b/bootstrap-win/neovim.ps1
@@ -50,6 +50,40 @@ function Test-CommandExists([string]$Name) {
50 return [bool](Get-Command $Name -ErrorAction SilentlyContinue) 50 return [bool](Get-Command $Name -ErrorAction SilentlyContinue)
51} 51}
52 52
53function Find-BinaryDirectory([string]$Binary) {
54 # Sucht nach "<Binary>.exe" unter den ueblichen Installationswurzeln.
55 # Deckt den Fall ab, dass ein winget-Paket (v.a. im --silent-Modus)
56 # die PATH-Registrierung ausgelassen hat, obwohl es korrekt installiert
57 # wurde - beobachtet bei LLVM.LLVM/clangd.
58 $searchRoots = @(
59 $env:ProgramFiles,
60 ${env:ProgramFiles(x86)},
61 (Join-Path $env:LOCALAPPDATA "Programs")
62 ) | Where-Object { $_ -and (Test-Path $_) }
63
64 foreach ($root in $searchRoots) {
65 $found = Get-ChildItem -Path $root -Recurse -Depth 4 -Filter "$Binary.exe" -File -ErrorAction SilentlyContinue | Select-Object -First 1
66 if ($found) {
67 return $found.DirectoryName
68 }
69 }
70
71 return $null
72}
73
74function Add-ToUserPath([string]$Dir) {
75 $userPath = [Environment]::GetEnvironmentVariable("PATH", "User")
76 $entries = $userPath -split ";"
77
78 if ($entries -contains $Dir) {
79 return $false
80 }
81
82 [Environment]::SetEnvironmentVariable("PATH", "$userPath;$Dir", "User")
83 $env:PATH = "$env:PATH;$Dir"
84 return $true
85}
86
53function Install-WingetPackage([string]$Binary, [string]$Id) { 87function Install-WingetPackage([string]$Binary, [string]$Id) {
54 if (Test-CommandExists $Binary) { 88 if (Test-CommandExists $Binary) {
55 Write-Skip $Binary 89 Write-Skip $Binary
@@ -67,8 +101,21 @@ function Install-WingetPackage([string]$Binary, [string]$Id) {
67 # Paket ist laut winget installiert, aber die Binary steht trotzdem 101 # Paket ist laut winget installiert, aber die Binary steht trotzdem
68 # nicht im PATH - z.B. weil der Installer (im --silent-Modus) die 102 # nicht im PATH - z.B. weil der Installer (im --silent-Modus) die
69 # PATH-Registrierung uebersprungen hat. winget search hilft hier 103 # PATH-Registrierung uebersprungen hat. winget search hilft hier
70 # nicht weiter, da das Paket ja gefunden wurde. 104 # nicht weiter, da das Paket ja gefunden wurde - stattdessen selbst
71 Write-Warn "$Id ist laut winget bereits installiert, aber '$Binary' wurde nicht gefunden. Vermutlich fehlt das Installationsverzeichnis im PATH - Installationsordner suchen (z.B. unter Program Files) und manuell zum PATH hinzufuegen." 105 # danach suchen und den User-PATH ergaenzen (dauerhaft + fuer diese
106 # Sitzung).
107 $dir = Find-BinaryDirectory $Binary
108
109 if ($dir) {
110 Add-ToUserPath $dir | Out-Null
111 if (Test-CommandExists $Binary) {
112 Write-Ok "$Id ('$Binary' in $dir gefunden, User-PATH ergaenzt)"
113 } else {
114 Write-Warn "$Id: $dir zum User-PATH hinzugefuegt, aber '$Binary' laesst sich immer noch nicht ausfuehren - manuell pruefen."
115 }
116 } else {
117 Write-Warn "$Id ist laut winget bereits installiert, aber '$Binary' wurde nicht gefunden und konnte auch nicht automatisch lokalisiert werden (durchsucht: Program Files, Program Files (x86), $env:LOCALAPPDATA\Programs). Installationsordner manuell suchen und zum PATH hinzufuegen."
118 }
72 } else { 119 } else {
73 Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id" 120 Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id"
74 } 121 }