WinGet ist der "Windows Paket Manager", also eine Software zum automatisierten Managen von Software auf Windows-PCs. Leider kann man bei der Aktualisierung keine Pakete ausschließen. Deshalb habe ich ein kleines PowershellSkript geschrieben, um genau das zu ermöglichen. Hier mehr zu WinGet: Der Windows Paket Manager WinGet

Hatte gerade gesehen, sollte das Skript "hängen", und Ihr setzt Winget zum ersten mal ein, dann ein "Winget list" ausführen, und die Lizenz bestätigen.

Starten des Skriptes

Wie bereits im vorangegangenen Artikel beschrieben, kann man relativ einfach alles auf den aktuellen Stand halten, wenn man:

WinGet upgrade --all

verwendet. Leider gibt es aber nichts um Software auszuschließen. Ich habe zum Beispiel ein Paket, welches ich nicht aktualisieren möchte, da der Hersteller in die Nachfolgeversion Einschränkungen eingebaut hat. Ein weiteres Paket macht Probleme bei der Installation, und hängt in einer Art "Endlosschleife", indem es sich immer wieder installiert.

Um dennoch den Aktualisierungsprozess zu automatisieren, habe ich ein kleines Script für die Powershell geschrieben. Der Aufruf erfolgt simpel über:

.\Autoupgrade.ps1

in der Powershell. Es wird eine Auflistung erstellt, was dieses Script tun würde, also ein Ansichtsmodus. Mit:

.\Autoupgrade.ps1 -upgrade

erfolgt dann wirklich eine Aktualisierung des System, soweit dem Paketmanager möglich. 

Ich empfehle die Powershell als Superuser zu starten, um die Windows-Sicherheitshinweise nicht mit jedem Paket bestätigen zu müssen!

Anpassen der Ausgeschlossenen (Exkludierten) Software

Dazu einfach das Skript in einem Texteditor öffnen, und das Feld "$toSkip" hierfür anpassen:

$toSkip = @(
	"Microsoft.VisualStudio.2019.BuildTools",
	"Amazon.Kindle",
	"Logitech.Options",
	"Microsoft.OneDrive",
	"Insomnia.Insomnia",
	"Microsoft.ASPNetCore.5-x64",
	"Microsoft.dotnet"
)

Die SoftwareIDs, werden dabei in Anführungsstrichen gesetzt, und mit Komma getrennt. Nach dem Anpassen speichern, und schon kann es losgehen. Vorher einfach mit dem einfachen Aufruf ohne "-upgrade" testen.

kurze Erläuterung zur Funktionsweise des Skriptes

Im ersten Teil des Skriptes werden ein paar Initialisierungen durchgeführt. Der Parameter wird z.B. eingelesen, außerdem unterstützt das Tool WinGet in Deutsch und Englisch.
Dann wird ein Objekt deklariert, welches die Software welche von WinGet gelesen wird, gespeichert werden kann:

#declare object for data
class Software{
	[string]$Name
	[string]$ID
	[string]$Version
	[string]$NewVersion
	[string]$Source
}

 es folgt eine Funktion, welche benötigt wird, um an die erste Stelle der Ausgabe von WinGet zu springen, um die Daten einzulesen. Dazu geht das Skript in einer Schleife alle Zeilen durch, bis es auf die "Name"-Spalte stösst.

function ForwardToHeader([string[]]$lines){
	$idx = 0
	while(-not $lines[$idx].StartsWith($nameCol)){
		$idx++
	}
	if(-not $lines[$idx].StartsWith($nameCol)){
		return -1
	}else{
		return $idx
	}
}

 Die weitere Funktion GetUpgradeList stellt das "Herz" des Skriptes dar, und liest zuerst die aktualisierbare Software von WinGet ein, ermittelt die Spalten, und erzeugt anhand dieser Werte eine Objektliste mit Daten.

	#build object list
	$upgradeList = @()
	For($i=$HeaderLineIdx+2; $i -le $lines.Length; $i++){
		$currLine = $lines[$i]
		
		if ($currLine.Length -lt $sourceStart){
		  continue
		}
		if ($currLine.Substring(0, 2) -eq '--'){
		  continue
		}
			
		$software = [Software]::new()
		$software.Name = $currLine.Substring($nameStart, $nameLen).Trim()
		$software.Id = $currLine.Substring($idStart, $idLen).TrimEnd().TrimStart('¦ ').TrimStart('ª ')
		$software.Version = $currLine.Substring($versionStart, $versionLen).Trim()
		$software.NewVersion = $currLine.Substring($availableStart, $availableLen).Trim()
		$software.Source = $currLine.Substring($sourceStart, $currLine.Length - $sourceStart).Trim()
		$upgradeList += $software
	}
	return $upgradeList

Dabei werden noch einige Formatierungen durchgeführt, um Sonderzeichen zu entfernen.
Im letzten Schritt wird nun noch geprüft ob es sich um den Ansichtsmodus handelt, oder um die Aktualisierung.
Dann wird die GetUpgradeList-Funktion aufgerufen, und das Update der Software Schritt-für-Schritt durchgeführt:

foreach($software in $upgradeList){

	if (-not ($toSkip -contains $software.Id)){
		Write-Host "Upgrade Software $($software.id)"
		if($param -eq "-upgrade"){
			winget upgrade --id $software.id --exact
		}
	}else{
		Write-Host "Skip Software $($software.id)"
	} 
}

Download des Skriptes

Autoupgrade Skript

 

 


2 Kommentare zu “Automatisierte Softwareaktualisierung mit WinGet”

    • ..da ist wohl bei der Aktualisierung der Webseite ein Fehler unterlaufen, nun funkt es wieder. Unter https://www.cloud-9.de/downloads hatte es aber auch schon vorher geklappt.
      greets
      VoSs2o0o

Kommentar hinterlassen

Als Antwort auf Some User