From f60d38e2ad0fdc5b0de7aea2d31ddaa0a3485c86 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 24 Jul 2026 10:06:52 +0200 Subject: bootstrap-win: PATH-Ergaenzung fuer bereits installierte, aber nicht gefundene Pakete automatisieren Neue Helper Find-BinaryDirectory (sucht .exe unter Program Files, Program Files (x86), %LOCALAPPDATA%\Programs) und Add-ToUserPath (dauerhaft + fuer die laufende Sitzung). Install-WingetPackage nutzt das jetzt automatisch im 'bereits installiert, aber nicht im PATH'-Fall (bisher nur als manueller Hinweis, z.B. clangd/LLVM.LLVM im Praxistest) statt den User manuell suchen zu lassen. --- bootstrap-win/neovim.ps1 | 51 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'bootstrap-win') 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) { return [bool](Get-Command $Name -ErrorAction SilentlyContinue) } +function Find-BinaryDirectory([string]$Binary) { + # Sucht nach ".exe" unter den ueblichen Installationswurzeln. + # Deckt den Fall ab, dass ein winget-Paket (v.a. im --silent-Modus) + # die PATH-Registrierung ausgelassen hat, obwohl es korrekt installiert + # wurde - beobachtet bei LLVM.LLVM/clangd. + $searchRoots = @( + $env:ProgramFiles, + ${env:ProgramFiles(x86)}, + (Join-Path $env:LOCALAPPDATA "Programs") + ) | Where-Object { $_ -and (Test-Path $_) } + + foreach ($root in $searchRoots) { + $found = Get-ChildItem -Path $root -Recurse -Depth 4 -Filter "$Binary.exe" -File -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($found) { + return $found.DirectoryName + } + } + + return $null +} + +function Add-ToUserPath([string]$Dir) { + $userPath = [Environment]::GetEnvironmentVariable("PATH", "User") + $entries = $userPath -split ";" + + if ($entries -contains $Dir) { + return $false + } + + [Environment]::SetEnvironmentVariable("PATH", "$userPath;$Dir", "User") + $env:PATH = "$env:PATH;$Dir" + return $true +} + function Install-WingetPackage([string]$Binary, [string]$Id) { if (Test-CommandExists $Binary) { Write-Skip $Binary @@ -67,8 +101,21 @@ function Install-WingetPackage([string]$Binary, [string]$Id) { # Paket ist laut winget installiert, aber die Binary steht trotzdem # nicht im PATH - z.B. weil der Installer (im --silent-Modus) die # PATH-Registrierung uebersprungen hat. winget search hilft hier - # nicht weiter, da das Paket ja gefunden wurde. - 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." + # nicht weiter, da das Paket ja gefunden wurde - stattdessen selbst + # danach suchen und den User-PATH ergaenzen (dauerhaft + fuer diese + # Sitzung). + $dir = Find-BinaryDirectory $Binary + + if ($dir) { + Add-ToUserPath $dir | Out-Null + if (Test-CommandExists $Binary) { + Write-Ok "$Id ('$Binary' in $dir gefunden, User-PATH ergaenzt)" + } else { + Write-Warn "$Id: $dir zum User-PATH hinzugefuegt, aber '$Binary' laesst sich immer noch nicht ausfuehren - manuell pruefen." + } + } else { + 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." + } } else { Write-Warn "winget install $Id fehlgeschlagen (Binary '$Binary' nicht gefunden): $lastLine -- Pruefen mit: winget search $Id" } -- cgit v1.3