VirtualBox Auto-Update Script für Windows (Winget)

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smileys
:) ;) :smile: :lol: :hihi: :D :rofl: :muahah: :( :pff: :kopfstreichel: :ohno: :betruebt: :heulen: :kopfkratz: :duckundweg: :o :? :oops: :psst: :sauer: :-P :daumenrunter: :daumen: :dankeschoen: :thx: :dafür: :gähn:
Mehr Smileys anzeigen

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Ansicht erweitern Die letzten Beiträge des Themas: VirtualBox Auto-Update Script für Windows (Winget)

Re: VirtualBox Auto-Update Script für Windows (Winget)

von Holgi » 14.09.2025, 23:11

auf vielfachen Wunsch:
mit diesem Script könnt ihr Winget in der Windows Sandbox installieren (als Vorbereitung für das VirtualBox Script):
Dynamische Installation von Winget und Dependencies.cmd

Code: Alles auswählen

@Echo off
rem Dynamische Installation von Winget und Abhängigkeiten
chcp 1252 >nul 
setlocal enabledelayedexpansion

:: Bestimme das aktuelle Skriptverzeichnis
set "SCRIPT_DIR=%~dp0"

:: GitHub API URL
set "GITHUB_API=https://api.github.com/repos/microsoft/winget-cli/releases/latest"

:: Hole URLs direkt in Variablen
for /f "usebackq delims=" %%i in (`powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$response = Invoke-RestMethod '%GITHUB_API%';" ^
    "$response.assets | Where-Object { $_.name -like '*DesktopAppInstaller_Dependencies.zip' } | Select-Object -ExpandProperty browser_download_url"`) do (
    set "DEPENDENCIES_URL=%%i"
)

for /f "usebackq delims=" %%i in (`powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$response = Invoke-RestMethod '%GITHUB_API%';" ^
    "$response.assets | Where-Object { $_.name -like '*Microsoft.DesktopAppInstaller_*.msixbundle' } | Select-Object -ExpandProperty browser_download_url"`) do (
    set "WINGET_URL=%%i"
)

:: Überprüfe, ob URLs korrekt gefunden wurden
if "%DEPENDENCIES_URL%"=="" (
    echo Fehler: Konnte keine Download-URL für Abhängigkeiten finden!
    pause
    exit /b
)
if "%WINGET_URL%"=="" (
    echo Fehler: Konnte keine Download-URL für Winget finden!
    pause
    exit /b
)

:: Lokale Dateipfade setzen
set "DEPENDENCIES_ZIP=%SCRIPT_DIR%DesktopAppInstaller_Dependencies.zip"
set "DEPENDENCIES_FOLDER=%SCRIPT_DIR%DesktopAppInstaller_Dependencies"
set "WINGET_INSTALLER=%SCRIPT_DIR%MicrosoftDesktopAppInstaller_8wekyb3d8bbwe.msixbundle"

echo Lade Abhängigkeiten herunter...

:: Lade die Dateien herunter
powershell -command "Start-BitsTransfer -Source '%DEPENDENCIES_URL%' -Destination '%DEPENDENCIES_ZIP%'"
powershell -command "Start-BitsTransfer -Source '%WINGET_URL%' -Destination '%WINGET_INSTALLER%'"

:: Überprüfe, ob die Dateien existieren
if not exist "%DEPENDENCIES_ZIP%" (
    echo Fehler: Der Download der Abhängigkeiten ist fehlgeschlagen!
    pause
    exit /b
)
if not exist "%WINGET_INSTALLER%" (
    echo Fehler: Der Download von Winget ist fehlgeschlagen!
    pause
    exit /b
)

:: Stelle sicher, dass das Zielverzeichnis existiert
if not exist "%DEPENDENCIES_FOLDER%" mkdir "%DEPENDENCIES_FOLDER%"

:: Entpacken direkt in den gewünschten Ordner
echo Entpacke Abhängigkeiten in %DEPENDENCIES_FOLDER%...
powershell -command "Expand-Archive -Path '%DEPENDENCIES_ZIP%' -DestinationPath '%DEPENDENCIES_FOLDER%' -Force"

:: Falls ein doppelter Unterordner entstanden ist, korrigieren
if exist "%DEPENDENCIES_FOLDER%\DesktopAppInstaller_Dependencies\x64" (
    move "%DEPENDENCIES_FOLDER%\DesktopAppInstaller_Dependencies\x64" "%DEPENDENCIES_FOLDER%"
    rmdir /s /q "%DEPENDENCIES_FOLDER%\DesktopAppInstaller_Dependencies"
)

:: Sicherstellen, dass der x64-Ordner existiert
if not exist "%DEPENDENCIES_FOLDER%\x64" (
    echo Fehler: Der x64-Ordner mit den AppX-Paketen wurde nicht gefunden!
    pause
    exit /b
)

:: Abhängigkeiten installieren
echo Installiere Abhängigkeiten...

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$files = Get-ChildItem -Path '%DEPENDENCIES_FOLDER%\x64' -Filter '*.appx' -Recurse;" ^
    "if ($files.Count -eq 0) { Write-Host 'Fehler: Keine AppX-Abhängigkeiten gefunden!'; exit 1 }" ^
    "else { foreach ($file in $files) { Add-AppXPackage -Path $file.FullName } }"

if %ERRORLEVEL% NEQ 0 (
    echo Fehler: Die Installation der Abhängigkeiten ist fehlgeschlagen!
    pause
    exit /b
)

:: Winget installieren
echo Installiere Winget...
powershell -command "Add-AppXPackage -Path '%WINGET_INSTALLER%'"

if %ERRORLEVEL% NEQ 0 (
    echo Fehler: Die Installation von Winget ist fehlgeschlagen!
    pause
    exit /b
)

echo Installation abgeschlossen.

:: Winget testen
winget list --accept-source-agreements

timeout /t 10
endlocal
exit /b

VirtualBox Auto-Update Script für Windows (Winget)

von Holgi » 14.09.2025, 20:49

Es hat mich in letzter Zeit immer genervt, dass

Code: Alles auswählen

Winget Upgrade --all
für VirtualBox ein Update anzeigt, aber dieses nicht installiert.
Angeblich soll dieses passieren, wenn VirtualBox selbst nicht mit Winget installiert wurde.
Also dachte ich mir: dann eben zukünftig mit Winget installieren. Wenn es aber schon installiert ist (.exe/.msi,) dann muss es erst mal wech. Das geht so oder so mit Winget.
Hat man mehrere PCs, dann bietet es sich an, diesen Vorgang zu automatisieren. Also wieder mal ein Script für den Script-Junkie.

Das unten stehende Script prüft die aktuelle Version von VirtualBox auf deren Servern, gleicht es mit einer ggf. installierten Version ab und wenn die installierte Version nicht der aktuellen Version entspricht, dann wird VB erst mit Winget de-installiert und später mit Winget neu installiert. Weil über Winget leider das VB Extension Pack nicht installiert werden kann, lasse ich es zumindest mit dem Script herunterladen, um es dann später aus dem geöffneten Programm heraus installieren zu können.
install_virtualbox_latest.ps1

Code: Alles auswählen

@Echo off
rem Dynamische Installation von Winget und Abhängigkeiten
chcp 1252 >nul 
setlocal enabledelayedexpansion

:: Bestimme das aktuelle Skriptverzeichnis
set "SCRIPT_DIR=%~dp0"

:: GitHub API URL
set "GITHUB_API=https://api.github.com/repos/microsoft/winget-cli/releases/latest"

:: Hole URLs direkt in Variablen
for /f "usebackq delims=" %%i in (`powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$response = Invoke-RestMethod '%GITHUB_API%';" ^
    "$response.assets | Where-Object { $_.name -like '*DesktopAppInstaller_Dependencies.zip' } | Select-Object -ExpandProperty browser_download_url"`) do (
    set "DEPENDENCIES_URL=%%i"
)

for /f "usebackq delims=" %%i in (`powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$response = Invoke-RestMethod '%GITHUB_API%';" ^
    "$response.assets | Where-Object { $_.name -like '*Microsoft.DesktopAppInstaller_*.msixbundle' } | Select-Object -ExpandProperty browser_download_url"`) do (
    set "WINGET_URL=%%i"
)

:: Überprüfe, ob URLs korrekt gefunden wurden
if "%DEPENDENCIES_URL%"=="" (
    echo Fehler: Konnte keine Download-URL für Abhängigkeiten finden!
    pause
    exit /b
)
if "%WINGET_URL%"=="" (
    echo Fehler: Konnte keine Download-URL für Winget finden!
    pause
    exit /b
)

:: Lokale Dateipfade setzen
set "DEPENDENCIES_ZIP=%SCRIPT_DIR%DesktopAppInstaller_Dependencies.zip"
set "DEPENDENCIES_FOLDER=%SCRIPT_DIR%DesktopAppInstaller_Dependencies"
set "WINGET_INSTALLER=%SCRIPT_DIR%MicrosoftDesktopAppInstaller_8wekyb3d8bbwe.msixbundle"

echo Lade Abhängigkeiten herunter...

:: Lade die Dateien herunter
powershell -command "Start-BitsTransfer -Source '%DEPENDENCIES_URL%' -Destination '%DEPENDENCIES_ZIP%'"
powershell -command "Start-BitsTransfer -Source '%WINGET_URL%' -Destination '%WINGET_INSTALLER%'"

:: Überprüfe, ob die Dateien existieren
if not exist "%DEPENDENCIES_ZIP%" (
    echo Fehler: Der Download der Abhängigkeiten ist fehlgeschlagen!
    pause
    exit /b
)
if not exist "%WINGET_INSTALLER%" (
    echo Fehler: Der Download von Winget ist fehlgeschlagen!
    pause
    exit /b
)

:: Stelle sicher, dass das Zielverzeichnis existiert
if not exist "%DEPENDENCIES_FOLDER%" mkdir "%DEPENDENCIES_FOLDER%"

:: Entpacken direkt in den gewünschten Ordner
echo Entpacke Abhängigkeiten in %DEPENDENCIES_FOLDER%...
powershell -command "Expand-Archive -Path '%DEPENDENCIES_ZIP%' -DestinationPath '%DEPENDENCIES_FOLDER%' -Force"

:: Falls ein doppelter Unterordner entstanden ist, korrigieren
if exist "%DEPENDENCIES_FOLDER%\DesktopAppInstaller_Dependencies\x64" (
    move "%DEPENDENCIES_FOLDER%\DesktopAppInstaller_Dependencies\x64" "%DEPENDENCIES_FOLDER%"
    rmdir /s /q "%DEPENDENCIES_FOLDER%\DesktopAppInstaller_Dependencies"
)

:: Sicherstellen, dass der x64-Ordner existiert
if not exist "%DEPENDENCIES_FOLDER%\x64" (
    echo Fehler: Der x64-Ordner mit den AppX-Paketen wurde nicht gefunden!
    pause
    exit /b
)

:: Abhängigkeiten installieren
echo Installiere Abhängigkeiten...

powershell -NoProfile -ExecutionPolicy Bypass -Command ^
    "$files = Get-ChildItem -Path '%DEPENDENCIES_FOLDER%\x64' -Filter '*.appx' -Recurse;" ^
    "if ($files.Count -eq 0) { Write-Host 'Fehler: Keine AppX-Abhängigkeiten gefunden!'; exit 1 }" ^
    "else { foreach ($file in $files) { Add-AppXPackage -Path $file.FullName } }"

if %ERRORLEVEL% NEQ 0 (
    echo Fehler: Die Installation der Abhängigkeiten ist fehlgeschlagen!
    pause
    exit /b
)

:: Winget installieren
echo Installiere Winget...
powershell -command "Add-AppXPackage -Path '%WINGET_INSTALLER%'"

if %ERRORLEVEL% NEQ 0 (
    echo Fehler: Die Installation von Winget ist fehlgeschlagen!
    pause
    exit /b
)

echo Installation abgeschlossen.

CLS

del "%localAppData%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json" /f /q
echo ======================
echo konfiguriere Settings
echo ====================== & echo.

if exist "%localAppData%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json" del "%localAppData%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json" /f /q


@Echo off
(
Echo {
Echo    "$schema": "https://aka.ms/winget-settings.schema.json",

Echo    // For documentation on these settings, see: https://aka.ms/winget-settings
Echo "source": {
Echo    "autoUpdateIntervalInMinutes": 5
Echo  },

Echo "visual": {
Echo     "progressBar": "rainbow"
Echo  },


Echo  "experimentalFeatures": {
Echo     "uninstall": false,
Echo     "upgrade": false,
Echo     "list": false,
Echo     "experimentalMSStore": false
Echo  },

Echo "telemetry": {
Echo     "disable": true
Echo },

Echo "installBehavior": {
Echo     "preferences": {
Echo         "locale": [ "de-DE", "en-US" ]
Echo     }
Echo },

Echo "installBehavior": {
Echo     "preferences": {
Echo        "scope": "user"
Echo   }
Echo  }
Echo }

) > "%localAppData%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json"

cls

:: Winget testen
winget list --accept-source-agreements
timeout /t 10 >nul

:clear
rmdir %~dp0DesktopAppInstaller_Dependencies /s /q >nul
del %~dp0MicrosoftDesktopAppInstaller_8wekyb3d8bbwe.msixbundle /f >nul
del %~dp0DesktopAppInstaller_Dependencies.zip >nul
cd \
(goto) 2>nul&rd /s /q "%~dp0"
endlocal
exit

Achtung!! Das Script löscht ungefragt eure evtl. bestehende VirtualBox Installation (wenn diese nicht auf dem aktellen Stand ist). Ich habe das Script aber so geschrieben, dass es auch in einer Windows Sandbox mit installiertem Winget getestet werden kann.
Viel Spaß!
Konstruktive Verbesserungsvorschläge sind immer und gerne willkommen.

Nach oben