Winget: update en installeer programma’s in een handomdraai

Noud van Kruysbergen
2

Winget, de onlangs in Windows geïntegreerde pakketbeheerder, maakt het voor liefhebbers van de opdrachtregel veel makkelijker om programma’s te installeren en bij te werken. Met een door ons gemaakt PowerShellscript worden updates nog handiger.

WinGet: update en installeer programma's in een handomdraai


Ontvang gratis informatie en tips over Windows, schrijf je in voor de nieuwsbrief:

Ontvang elke week het laatste IT-nieuws, de handigste tips en speciale aanbiedingen.

Beheren van geïnstalleerde software sterk vereenvoudigt

Windows bevat met winget sinds enige tijd een pakketbeheerder die het beheer van de geïnstalleerde software sterk vereenvoudigt. Het kent de downloadadressen van duizenden Windows-toepassingen en apps en kan die installeren zonder dat je je door het gebruikelijke klikwerk hoeft te worstelen. Wat hij moet doen om een programma te installeren of bij te werken, blijft beperkt tot het invoeren van een betrekkelijk eenvoudig commando in een Opdrachtprompt of een PowerShell-venster.

In het eenvoudigste geval download je software met winget install programmanaam en installeer je het in één keer. Metuninstall in plaats van install kun je je ontdoen van een programma en met upgrade kun je een bestaande update installeren.

Commando winget upgrade all

Om alle programma-updates te installeren die winget kent, zou je eenvoudigweg het commando winget upgrade –all kunnen gebruiken. Er zijn echter vaak goede redenen om eens nader te bekijken wat winget installeert.

Sommige gebruikers zijn nu eenmaal wantrouwig van aard en willen gewoon zelf bepalen wat er op hun machine gebeurt. Misschien wil je niet de allernieuwste versie van een bepaalde toepassing hebben. Een reden hiervoor kan zijn is dat je niet vertrouwd bent met nieuwere functies. Ook kan het zo zijn omdat je bestanden moet uitwisselen met collega’s die nog de oudere versie met een ander bestandsformaat gebruiken.

Er zijn ook programma’s waarvoor je liever de ingebouwde updatefunctie gebruikt omdat die wellicht beter omgaat met je eigen instellingen. Soms loopt winget ook een of twee versienummers achter bij programma’s die heel vaak worden bijgewerkt. In dergelijke gevallen is het ook beter om de update van de producent te gebruiken.

Softwareverzameling up-to-date houden zonder winget upgrade all

Als je je softwareverzameling up-to-date wilt houden met winget maar niet wilt vertrouwen op het commando winget upgrade –all, dan is de procedure meestal als volgt:

  • Gebruik eerst het commando winget upgrade om een overzicht te krijgen van welke updates beschikbaar zijn.
  • Maak vervolgens met behulp van kopiëren en plakken een commando voor elk programma dat moet worden bijgewerkt volgens het patroon winget upgrade–id Program.ID

Afhankelijk van het aantal programma’s en de snelheid van je internet kan het wachten op het volgende programma behoorlijk wat tijd in beslag nemen. Idealiter zou er een interactieve selectie moeten zijn, waarbij je met een paar muisklikken of toetsaanslagen de programma’s selecteert die moeten worden bijgewerkt en waarbij dan alle gewenste updates in één keer worden geïnstalleerd.

Gebruikmaken van een graphics user interface

Met het commando Out-GridView heeft PowerShell het belangrijkste ingrediënt voor zoiets aan boord. Als je daar een lijst van objecten samen met de optie -PassThru aan meegeeft, toont het de eigenschappen van de objecten in een apart venster op basis van tabbladen. Op deze manier kun je één of meerdere regels selecteren en de selectie bevestigen met OK. Vervolgens krijg je een lijst van de geselecteerde objecten terug. Hiermee kun je doen wat je wilt. Zo kun je bijvoorbeeld de overeenkomstige updates installeren.

Het script dat we gemaakt hebben heet winget-upgrade.ps1 en kun je hier downloaden. Het script werkt zowel met Windows PowerShell als met de opensource variant ervan. Het is raadzaam om na het downloaden het script in een map te zetten die in de omgevingsvariabele $Env:Path staat. Op die manier kun je namelijk het script eenvoudig starten door de naam in te voeren. Parameters zijn er niet.

Het uitvoeringsbeleid van PowerShell

Als het uitvoeringsbeleid van je PowerShell – zoals voor PowerShell 7 standaard het geval is en voor Windows PowerShell voor de meeste gebruikssituaties wordt aanbevolen – is ingesteld op RemoteSigned, moet je eenmalig het commando Remove-Item winget-upgrade.ps1 -Stream Zone.Identifier -EA Ignore gebruiken om ervoor te zorgen dat het script niet langer wordt gemarkeerd als een kwaadaardige download. De stream Zone.Identifier bevat de informatie dat het bestand afkomstig is van Internet. Als je dat verwijdert, wordt het als lokaal beschouwd. -EA Ignore is een afkorting voor -ErrorAction Ignore en onderdrukt een mogelijke foutmelding als het bestand de stream niet (meer) bevat.

Het uitvoeringsbeleid kan worden uitgelezen met het commando Get-ExecutionPolicy en op de juiste manier worden ingesteld met Set-ExecutionPolicy RemoteSigned. Meer informatie daarover krijg je met help about_Execution_Policies.

Administratorrechten verlenen aan winget

Om programma’s te installeren, heeft winget administratorrechten nodig. Om te voorkomen dat je dat voor elke update opnieuw moet bevestigen, is het raadzaam om het script met volledige rechten te starten. Als alternatief raden we aan om de opensource tool gsudo te installeren. Die introduceert het sudo-commando zoals je het kent van Linux-systemen bij Windows. Als je het voor een commando in Opdrachtprompt of PowerShell zet, wordt de opdracht uitgevoerd met administratorrechten.

De UAC-bevestiging is nog steeds nodig, maar slechts eenmalig indien gewenst. Om de bevestiging voor een bepaalde tijd te bewaren kan gsudo worden geconfigureerd. Ons WinGet-script controleert of gsudo geïnstalleerd is en gebruikt het indien nodig.

Wat zijn de bronnen?

Details over het uitvoeren van het script vallen buiten het bestek van dit artikel. Het kan echter een verrassing zijn dat er bijna 100 regels code nodig zijn voor die eenvoudig lijkende taak. Dit is hoofdzakelijk te wijten aan het feit dat winget pure tekst uitvoert. Dit in tegenstelling tot PowerShell die met zogeheten objecten wil werken. Een aanzienlijk deel van het script wordt dus besteed aan het uit elkaar trekken van de tekstuitvoer van de pakketbeheerder en het opnieuw samenstellen daarvan in objectvorm. Het feit dat WinGet een tekencodering gebruikt die ongebruikelijk is in PowerShell is daarbij niet echt behulpzaam.

De broncode bevat afgezien daarvan geen grote geheimen. Niets weerhoudt je er dus van het te bestuderen of aan te passen aan je eigen voorkeuren.

De redactie van c’t wenst je er in ieder geval veel plezier mee!

(Deze informatie is afkomstig uit het artikel van Hajo Schulz en Noud van Kruysbergen uit c’t magazine 11/2022, p. 98-99)

Lees meer over Windows in c't magazine 12/2022

Meer over

windows

Deel dit artikel

Lees ook

Van Linux naar Windows en terug – werken met Linux én Windows

Je hoeft niet te kiezen tussen Linux en Windows. Je kunt beide gebruiken en van Linux naar Windows en terug gaan. Zo pak je dat handig aan.

Maak een Raspberry Pi weerstation

Een weerstation maken is met een Raspberry Pi makkelijk en leuk om te doen. Als voorbeeld gaan we aan de slag met sensors voor de temperatuur, luchtvo...

2 Praat mee
avatar
  Abonneer  
nieuwsteoudste
Laat het mij weten wanneer er
Marc Engrie
Lezer
Marc Engrie

Hoi, Ik zie bij de opstart van winget-upgrade script de volgende errors: MethodInvocationException: D:\Utility\winget-upgrade.ps1:102 Line | 102 | $att = $utf.Substring($starts[$f], $starts[$f+1] – $starts[$f]) … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Exception calling “Substring” with “2” argument(s): “Index and length must refer to a location within the | string. (Parameter ‘length’)” MethodInvocationException: D:\Utility\winget-upgrade.ps1:102 Line | 102 | $att = $utf.Substring($starts[$f], $starts[$f+1] – $starts[$f]) … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Exception calling “Substring” with “2” argument(s): “startIndex cannot be larger than length of string. | (Parameter ‘startIndex’)” MethodInvocationException: D:\Utility\winget-upgrade.ps1:102 Line | 102 | $att = $utf.Substring($starts[$f], $starts[$f+1] – $starts[$f]) … | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | Exception calling “Substring”… Lees verder »