[gelöst] Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Du möchtest den Desktop oder die Apps schick machen? Deine Apps starten nicht oder lassen sich nicht installieren?
Benutzeravatar
Holgi
Elite
Elite
Beiträge: 2113
Registriert: 12.05.2018, 12:33
Hat sich bedankt: 207 Mal
Danke erhalten: 273 Mal
Gender:

[gelöst] Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Holgi » 28.12.2021, 15:33

vlt. hat ja der/die Eine oder Andere von Euch auch schon dieses Phänomen kennengelernt:
winget erkennt bei installierten Apps nicht die Versionsnummer der installierten Version und installiert deshalb bei jedem Aufruf von

Code: Alles auswählen

Winget upgrade --all
die App erneut. Bei mir ist es z.B. die vdhCopApp.
Version 1.6.3 ist installiert (über Winget); dennoch zeigt ein Winget Upgrade an:

Code: Alles auswählen

Name     		ID                Version 	Verfügbar     Quelle
---------------------------------------------------------------------------------------------------
VdhCoApp 	DownloadHelper.VdhCoApp     Unknown 	1.6.3     	winget
Das ist echt nervig.
Das Thema wird auch schon im Netz behandelt. Z.B. hier: https://github.com/microsoft/winget-cli/issues/1255
Einige lösen das Problem damit, dass sie die Versionsnummer manuell in der Registry nachtragen.
Grds. finde ich den Ansatz von einem gewissen "Nejat" auf Github gut, der ein Powershell-Script geschrieben hat, welches die "unknown-Version" Apps vor dem Upgrade aussortiert. Darüberhinaus kann man sein Script auch mit einer eigenen Skip-Liste versehen (Apps, welche nicht upgedatet werden sollen)
https://gist.github.com/Nejat?direction ... rt=created
Problem:
in dem Script sind (Unicode?)Zeichen, die ein dt. Windows nicht verarbeiten kann. Ich bekomme da sehr viele Fehlermeldungen.
Kann sich das jemand mal anschauen, der Powershell kann?
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114

Tante Google

[gelöst] Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Tante Google » 28.12.2021, 15:33


Benutzeravatar
Holgi
Elite
Elite
Beiträge: 2113
Registriert: 12.05.2018, 12:33
Hat sich bedankt: 207 Mal
Danke erhalten: 273 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Holgi » 28.12.2021, 20:24

offenbar arbeitet man an einem Schalter für Winget. Leider in der anderen (falschen) Richtung: --include-unknown
https://github.com/microsoft/winget-cli ... 777e60c0b2
--exclude-unknown wäre aus meiner Sicht sinnvoller.
Das script von "Nejat" ohne die Skip-Liste würde mir auch schon reichen.
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114

Benutzeravatar
DK2000
Legende
Legende
Beiträge: 9119
Registriert: 03.04.2018, 00:07
Hat sich bedankt: 149 Mal
Danke erhalten: 463 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von DK2000 » 08.01.2022, 13:01

Das Problem mit dem "Version: Unknown" ließe sich nur effektiv lösen, wenn winget eine lokale Datenbank mit den Anwendungen pflegen würde, welche es installiert hat. So ist winget auf das Setup der Anwendung angewiesen, welche installiert wird. Und hier trage leider nicht alle Setups die Version in die Registry ein und Setups ohne Uninstaller fallen ganz raus.

"VdhCoApp" ist so ein Kandidat, bei dem das Setup zwar einen Uninstall-Zweig schreibt, aber leider ohne Versions-Informationen für die Version, welche installiert wird. Daher kann winget auch nichts anzeigen. Sobald man das nachholt, weiß auch winget, was installiert ist:

Code: Alles auswählen

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\weh-iss-net.downloadhelper.coapp_is1]
"DisplayVersion"="1.6.0"

Code: Alles auswählen

PS C:\> winget list VdhCoApp
Name     ID                      Version Verfügbar Quelle
---------------------------------------------------------
VdhCoApp DownloadHelper.VdhCoApp 1.6.0   1.6.3     winget
Das finde ich schon die ganze Zeit unsauber gelöst, dass sich winget nur auf das verlässt, was die Setups so treiben und eigenständig nichts in de Richtung speichert. Die Schalter include-unknown und exclude-unknown sind eigentlich nur ein Workaround, um das eigentliche Problem zu umgehen. Eine lokale Datenbank von winget, in welcher es einträgt, was installiert ist, wäre hier besser und nicht einfach nur die "Uninstall"-Zweige durchzugehen und hoffen, das dort vom Setup alles geschrieben wurde, was benötigt wird.

Benutzeravatar
Holgi
Elite
Elite
Beiträge: 2113
Registriert: 12.05.2018, 12:33
Hat sich bedankt: 207 Mal
Danke erhalten: 273 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Holgi » 08.01.2022, 15:43

Danke @DK2000!
Nejat hat es wohl mit seinem Script geschafft, das Problem mit "Unknown" in den Griff zu bekommen.
Die von ihm ebenfalls programmierte Skip-Liste bräuchte ich nicht. Nur das PS-Script, welches wohl winget veranlasst, "unknown Version" Apps einfach auszulassen. Nur bekomme ich es nicht zum Laufen. Vlt. kannst du oder @Ben hier helfen?
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114

Benutzeravatar
Holgi
Elite
Elite
Beiträge: 2113
Registriert: 12.05.2018, 12:33
Hat sich bedankt: 207 Mal
Danke erhalten: 273 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Holgi » 08.01.2022, 15:47

habe es jetzt mal so vorerst erledigt:

Code: Alles auswählen

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\weh-iss-net.downloadhelper.coapp_is1]
"DisplayVersion"="1.6.3"
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114

Benutzeravatar
DK2000
Legende
Legende
Beiträge: 9119
Registriert: 03.04.2018, 00:07
Hat sich bedankt: 149 Mal
Danke erhalten: 463 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von DK2000 » 08.01.2022, 16:17

Wird aber beim nächsten Update wieder entfernt.

Mit der .ps1 ist es das Problem, das winget nicht wirklich in vollem Umfang für die PowerShell gedacht ist und man daher eine Filter benötigt, welcher aus der Pipe dem "Müll" entfernt:

Code: Alles auswählen

 ÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆ  1024 KB / 2.95 MB
 ÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆÔûÆ  2.00 MB / 2.95 MB
 ÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûêÔûê  2.95 MB / 2.95 MB
Und die Paketnamen in der Pipe haben da teilweise auch seltsame Zeichen, weil der Name abgeschnitten wird, z.B. "Microsoft Visual C++ 2015-2022 RedistrÔǪ". Das muss man natürlich auch korrigieren. Dafür ist wohl der Abschnitt gedacht:

Code: Alles auswählen

# temporary check if any properties have unicode garbled text
# this is only until winget piped output is fixed or supports power-shell natively
[bool] $garbled = (
  $pacakge.Name.EndsWith("ΓÇ") -or
  $pacakge.Id.EndsWith("ΓÇ") -or $pacakge.Id.StartsWith("ª ") -or
  $pacakge.Current.EndsWith("ΓÇ") -or $pacakge.Current.StartsWith("ª ") -or
  $pacakge.Available.EndsWith("ΓÇ") -or $pacakge.Available.StartsWith("ª ") -or
  $pacakge.Source.EndsWith("ΓÇ") -or $pacakge.Source.StartsWith("ª ")
)
Aber da bin ich gerade überfragt, was man da wie eintragen muss, damit das durch läuft.

Ist auch interessant, dass der Script mit der 5.1 anders läuft im Vergleich zur 7.2.

Scheint nicht so einfach zu sein, winget in einem PowerShell-Skript zu verwenden.

upapi
Neuling
Neuling
Beiträge: 7
Registriert: 08.01.2022, 22:15

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von upapi » 08.01.2022, 22:33

Da ich ständig ein Problem mit dem Upgrade eines bestimmten Programms hatte, habe ich mir mal das Powershell script angeschaut.
Im Moment läuft es bei mir auf mehreren Rechnern, nachdem ich folgendes geändert habe:
  • In Notepad++ pro forma nach UTF-8 konvertiert. Dann wird zumindest der Codeteil mit der Abfrage der Sonderzeichen korrekt durchlaufen.

    Code: Alles auswählen

    $pacakge.Name.EndsWith("GÇ") -or
                    $pacakge.Id.EndsWith("GÇ") -or $pacakge.Id.StartsWith("ª ") -or...
  • Dann bleibt noch das Problem der Spaltentitel auf deutschem Windows. Denn die werden hier explizit abgefragt, um die Position und Länge der Paketnamen, ID, Version usw. abfragen zu können. Umlaute sind auch ein Problem. Diesen Teil im Script habe ich wie folgt geändert:

    Code: Alles auswählen

    int32] $IdIndex = $source[$titleLine].IndexOf("ID")
    [int32] $currentIndex = $source[$titleLine].IndexOf("Version")
    [int32] $availableIndex = $source[$titleLine].IndexOf("Verf")
    [int32] $sourceIndex = $source[$titleLine].IndexOf(" Quelle")
    
    "Verf" steht für "Verfügung"; In " Quelle" das blank vor dem "Q" nicht vergessen; Und "ID" immer im gesamten Code auf Großbuchstaben ändern
  • Wenn alles klappt, dann scharf schalten, in dem man in dieser Zeile:

    Code: Alles auswählen

    [switch] $upgrade = $true
    aus dem "$false" ein "$true" macht
Vielleicht hilft das?

Benutzeravatar
Holgi
Elite
Elite
Beiträge: 2113
Registriert: 12.05.2018, 12:33
Hat sich bedankt: 207 Mal
Danke erhalten: 273 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Holgi » 09.01.2022, 00:37

magst du bitte mal das von dir editierte komplette Script hier posten? Danke!
Wie rufst du es dann auf?
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114

upapi
Neuling
Neuling
Beiträge: 7
Registriert: 08.01.2022, 22:15

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von upapi » 09.01.2022, 11:19

Hier das gesamte script

Code: Alles auswählen

param(
    # provide a skiplist file to define pacakges to skip
    [string] $skipFile = "winget-skiplist",
    # true to upgrade eligible packages, false dry run
    [switch] $upgrade = $false
)

# get raw output of available upgrades, not power-shell native yet
[string[]] $source = winget upgrade

# check if available upgrades succeeded, otherwise display message to user
if ($lastExitCode -ne 0) {
    Write-Host
    Write-Host checking winget upgrade failed, try again - ForegroundColor - Red
    Write-Host
    exit $lastExitCode
}

# load and parse a skip list definition file if it exists, otherwise ignore skips
[string[]] $skip = if (Test-Path -Path $skipFile -PathType Leaf) {
    Get-Content $skipFile | ForEach-Object {
        $_.Split('#')[0].Trim()
    }
} else {
    @("") # otherwise $skip is null
}

# find the index of title line, sometimes winget outputs unpredictably up until the title line
[int32] $titleLine = ($source | Select-String -Pattern "ID" | Select-Object -Expand LineNumber -First 1) - 1

# get all the indexes of column titles for parsing
[int32] $IdIndex = $source[$titleLine].IndexOf("ID")
[int32] $currentIndex = $source[$titleLine].IndexOf("Version")
[int32] $availableIndex = $source[$titleLine].IndexOf("Verf")
[int32] $sourceIndex = $source[$titleLine].IndexOf(" Quelle")

# fail if any of the indexes could not be determined
if ($IdIndex -eq $null -or $currentIndex -eq $null -or $availableIndex -eq $null -or $sourceIndex -eq $null) {
    Write-Host
    Write-Host winget failed because garbled output, try again - ForegroundColor - Yellow
    Write-Host
    exit -1
}

# parse all of the listed packages into an object; Package { Name, Id, Current, Available, Source, Skip }
[PSCustomObject[]] $updates = $source | Select-Object -Skip $($titleLine + 2) | Select-Object -SkipLast 1 | ForEach-Object { 
    [string] $name      = $_.SubString(0, $IdIndex).Trim()
    [string] $id        = $_.SubString($IdIndex, $currentIndex - $IdIndex).Trim()
    [string] $current   = $_.SubString($currentIndex, $availableIndex - $currentIndex).Trim()
    [string] $available = $_.SubString($availableIndex, $sourceIndex - $availableIndex).Trim()
    [string] $source    = $_.SubString($sourceIndex, $_.Length - $sourceIndex).Trim()

    [PSCustomObject] @{
        Name      = $name
        Id        = $id
        Current   = $Current
        Available = $available
        Source    = $source
        Skip      = $skip.Contains($name)
    }
}

# determine the widest package name for column padding
[int32] $namePadding = ($updates | ForEach-Object { $_.Name.Length } | Measure-Object -Maximum | Select-Object -Property Maximum).Maximum + 2
# determin the widest package version for column padding
[int32] $versionPadding = ($updates | ForEach-Object { [math]::Max($_.Current.Length, $_.Available.Length) } | Measure-Object -Maximum | Select-Object -Property Maximum).Maximum + 2
# const status width padding
[int32] $statusWidth = 42  # ironic? or cosmic? =P

# write table column titles
Write-Host
Write-Host "Name".PadRight($namePadding, ' ')  "Version".PadLeft($versionPadding, ' ') "Available".PadLeft($versionPadding, ' ') "  Status"
Write-Host ("-" * $namePadding) ("-" * $versionPadding) ("-" * $versionPadding) " " ("-" * $statusWidth)
Write-Host

# process each package
foreach ($pacakge in $updates) {
    # output package info coumns
    Write-Host $pacakge.Name.PadRight($namePadding) $pacakge.Current.PadLeft($versionPadding, ' ') $pacakge.Available.PadLeft($versionPadding, ' ') "- " -NoNewline

    # check if package should be skipped?
    if ($pacakge.Skip) {
        # output package status
        Write-Host "skipping" -ForegroundColor DarkYellow
        if ($upgrade) { Write-Host }
    } else {
        # check if package version is unknown
        if ($pacakge.Current -eq "Unknown") {
            # output package status
            Write-Host "skipping unkown version, check manually" -ForegroundColor Cyan
            if ($upgrade) { Write-Host }
        } else {
            # temporary check if any properties have unicode garbled text
            # this is only until winget piped output is fixed or supports power-shell natively
            [bool] $garbled = (
                $pacakge.Name.EndsWith("GÇ") -or
                $pacakge.Id.EndsWith("GÇ") -or $pacakge.Id.StartsWith("ª ") -or
                $pacakge.Current.EndsWith("GÇ") -or $pacakge.Current.StartsWith("ª ") -or
                $pacakge.Available.EndsWith("GÇ") -or $pacakge.Available.StartsWith("ª ") -or
                $pacakge.Source.EndsWith("GÇ") -or $pacakge.Source.StartsWith("ª ")
            )

            # check if packages should upgraded
            if ($upgrade) {
                # check if any property is garbled
                if ($garbled) {
                    # output package status and continue to next package
                    Write-Host "skipping, garbled identifiers prevents update" -ForegroundColor Yellow
                } else {
                    # perform pacakge upgrade, capture output
                    [string[]] $result = winget upgrade --name """$($pacakge.Name)""" --id """$($pacakge.Id)""" --version """$($pacakge.Available)"""

                    # check if pacakge upgrade succeeded and output package status accordingly
                    if ($lastExitCode -eq 0) {
                        Write-Host "updated" -ForegroundColor Blue
                    } else {
                        Write-Host "failed to update" -ForegroundColor Red
                        Write-Host
                        # demonstrate command used for upgrade
                        Write-Host ">" winget upgrade --name """$($pacakge.Name)""" --id """$($pacakge.Id)""" --version """$($pacakge.Available)""" -ForegroundColor Yellow
                        # output captured output from package upgrade
                        foreach ($line in $result) {
                            Write-Host $line -ForegroundColor DarkGray
                        }
                    }
                }

                Write-Host
            } else {
                # check if any property is garbled and output package status accordingly 
                if ($garbled) {
                    Write-Host "skipping new version, garbled identifiers prevent update" -ForegroundColor Yellow
                } else {
                    Write-Host "new version available" -ForegroundColor Blue
                }
            }
        }
    }
}

Write-Host
Der Aufruf des scripts kann auf mehrere Arten erfolgen. Außerdem müssen die Ausführungsrichtlinien für Powershell geändert werden - ist vielleicht auch schon bekannt? - am besten in "Set-ExecutionPolicy -scope CurrentUser -executionPolicy RemoteSigned"
Dann in die Powershell Konsole zum Ordner des Scripts wechseln und folgendes eingeben: ./meinscript.ps1

Oder den "ISE" (Powershell editor) aufrufen und dort das script ausführen.

Benutzeravatar
Holgi
Elite
Elite
Beiträge: 2113
Registriert: 12.05.2018, 12:33
Hat sich bedankt: 207 Mal
Danke erhalten: 273 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Holgi » 09.01.2022, 13:20

ich bekomme beim Aufruf nur Fehlermeldungen. Sieht so aus:

Code: Alles auswählen

./winget_test.ps1
Ausnahme beim Aufrufen von "Substring" mit 2 Argument(en):  "Die Länge darf nicht kleiner als 0 (null) sein.
Parametername: length"
In C:\Users\Darth Vader\Downloads\winget_test.ps1:47 Zeichen:5
+     [string] $name      = $_.SubString(0, $IdIndex).Trim()
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException

Ausnahme beim Aufrufen von "Substring" mit 2 Argument(en):  "StartIndex darf nicht kleiner als Null sein.
Parametername: startIndex"
In C:\Users\Darth Vader\Downloads\winget_test.ps1:48 Zeichen:5
+     [string] $id        = $_.SubString($IdIndex, $currentIndex - $IdI ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException

Ausnahme beim Aufrufen von "Substring" mit 2 Argument(en):  "StartIndex darf nicht kleiner als Null sein.
Parametername: startIndex"
In C:\Users\Darth Vader\Downloads\winget_test.ps1:49 Zeichen:5
+     [string] $current   = $_.SubString($currentIndex, $availableIndex ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException

Ausnahme beim Aufrufen von "Substring" mit 2 Argument(en):  "StartIndex darf nicht kleiner als Null sein.
Parametername: startIndex"
In C:\Users\Darth Vader\Downloads\winget_test.ps1:50 Zeichen:5
+     [string] $available = $_.SubString($availableIndex, $sourceIndex  ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException

Ausnahme beim Aufrufen von "Substring" mit 2 Argument(en):  "StartIndex darf nicht kleiner als Null sein.
Parametername: startIndex"
In C:\Users\Darth Vader\Downloads\winget_test.ps1:51 Zeichen:5
+     [string] $source    = $_.SubString($sourceIndex, $_.Length - $sou ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : ArgumentOutOfRangeException


Name Version Available   Status
-- -- --   ------------------------------------------

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Users\Darth Vader\Downloads\winget_test.ps1:79 Zeichen:5
+     Write-Host $pacakge.Name.PadRight($namePadding) $pacakge.Current. ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Users\Darth Vader\Downloads\winget_test.ps1:95 Zeichen:13
+             [bool] $garbled = (
+             ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114

upapi
Neuling
Neuling
Beiträge: 7
Registriert: 08.01.2022, 22:15

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von upapi » 09.01.2022, 14:45

OK, das hatte ich auch dauernd. Bei mir lags daran, dass die Spaltenüberschriften von winget upgrade nicht korrekt ausgelesen werden konnten. Bitte zeig doch mal den output von "winget upgrade", wie es bei dir aussieht.

Und dann noch was. Die Codezeile

Code: Alles auswählen

[switch] $upgrade = $true
wieder in

Code: Alles auswählen

[switch] $upgrade = $false
umwandeln.

Den "switch" Parameter hatte ich übersehen. Beim Aufruf ohne Parameter (also ./winget_test.ps1) wird kein upgrade ausgeführt. Beim Aufruf mit Parameter (also ./winget_test.ps1 -upgrade) wird das upgrade auch ausgeführt.

Aber schauen wir erstmal, ob wir das Teil bei dir zum Laufen bekommen.

Benutzeravatar
DK2000
Legende
Legende
Beiträge: 9119
Registriert: 03.04.2018, 00:07
Hat sich bedankt: 149 Mal
Danke erhalten: 463 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von DK2000 » 09.01.2022, 14:57

Diese Fehler erscheinen bei mir auch. Liegt aber daran, dass die Updateliste leer ist und der Abschnitt nicht greift:

Code: Alles auswählen

if ($IdIndex -eq $null -or $currentIndex -eq $null -or $availableIndex -eq $null -or $sourceIndex -eq $null) {
    Write-Host
    Write-Host winget failed because garbled output, try again - ForegroundColor - Yellow
    Write-Host
    exit -1
Das führt dann im weiteren Verlauf zu Fehlern, da es ja nicht an Name, ID, Version etc. gibt. Der Skript läuft aber weiter und das führt dann zu den Fehlern.

In der Pipe kommt nur das an:

Code: Alles auswählen

   -\ 
   - 
Es wurde kein installiertes Paket gefunden, das den Eingabekriterien entspricht.

Benutzeravatar
Holgi
Elite
Elite
Beiträge: 2113
Registriert: 12.05.2018, 12:33
Hat sich bedankt: 207 Mal
Danke erhalten: 273 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Holgi » 09.01.2022, 15:28

ah, verstehe. Danke!
Ich habe mal die Display Version für vdhcoApp aus der Registry wieder entfernt.
Winget Upgrade hat dann - wie erwartet - vdhcoApp 1.6.3 als Upgrade vorgeschlagen.
Sodann das Powershell script ausgeführt. Siehe da:

Code: Alles auswählen

Name         Version Available   Status
---------- --------- ---------   ------------------------------------------

VdhCoApp     Unknown     1.6.3 - skipping
Funktioniert also doch wohl und ohne Fehlermeldungen, wenn es etwas findet (mit Unknown).
Wäre natürlich schön, wenn diese Fehlermeldungen unterblieben, wenn nix gefunden wird; rein der Optik halber.
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114

upapi
Neuling
Neuling
Beiträge: 7
Registriert: 08.01.2022, 22:15

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von upapi » 09.01.2022, 15:34

Bitte mal diese Version testen. Die sollte auch funktionieren, wenn winget upgrade keine App findet

Code: Alles auswählen

param(
    # provide a skiplist file to define pacakges to skip
    [string] $skipFile = "winget-skiplist",
    # true to upgrade eligible packages, false dry run
    [switch] $upgrade = $false
)

# get raw output of available upgrades, not power-shell native yet
[string[]] $source = winget upgrade

# check if available upgrades succeeded, otherwise display message to user
if ($lastExitCode -ne 0) {
    Write-Host
    Write-Host checking winget upgrade failed, try again - ForegroundColor - Red
    Write-Host
    exit $lastExitCode
}

# load and parse a skip list definition file if it exists, otherwise ignore skips
[string[]] $skip = if (Test-Path -Path $skipFile -PathType Leaf) {
    Get-Content $skipFile | ForEach-Object {
        $_.Split('#')[0].Trim()
    }
} else {
    @("") # otherwise $skip is null
}

# find the index of title line, sometimes winget outputs unpredictably up until the title line
[int32] $titleLine = ($source | Select-String -Pattern "ID" | Select-Object -Expand LineNumber -First 1) - 1

# fail if no title line ist found; no upgradable app was found
if ($titleLine -le $null) {
    foreach ($line in $source) {
        Write-Host $line -ForegroundColor Yellow
    }
    Write-Host
    exit -1
}

# get all the indexes of column titles for parsing
[int32] $IdIndex = $source[$titleLine].IndexOf("ID")
[int32] $currentIndex = $source[$titleLine].IndexOf("Version")
[int32] $availableIndex = $source[$titleLine].IndexOf("Verf")
[int32] $sourceIndex = $source[$titleLine].IndexOf(" Quelle")

# fail if any of the indexes could not be determined
if ($IdIndex -eq $null -or $currentIndex -eq $null -or $availableIndex -eq $null -or $sourceIndex -eq $null) {
    Write-Host
    Write-Host winget failed because garbled output, try again - ForegroundColor - Yellow
    Write-Host
    exit -1
}

# parse all of the listed packages into an object; Package { Name, Id, Current, Available, Source, Skip }
[PSCustomObject[]] $updates = $source | Select-Object -Skip $($titleLine + 2) | Select-Object -SkipLast 1 | ForEach-Object { 
    [string] $name      = $_.SubString(0, $IdIndex).Trim()
    [string] $id        = $_.SubString($IdIndex, $currentIndex - $IdIndex).Trim()
    [string] $current   = $_.SubString($currentIndex, $availableIndex - $currentIndex).Trim()
    [string] $available = $_.SubString($availableIndex, $sourceIndex - $availableIndex).Trim()
    [string] $source    = $_.SubString($sourceIndex, $_.Length - $sourceIndex).Trim()

    [PSCustomObject] @{
        Name      = $name
        Id        = $id
        Current   = $Current
        Available = $available
        Source    = $source
        Skip      = $skip.Contains($name)
    }
}

# determine the widest package name for column padding
[int32] $namePadding = ($updates | ForEach-Object { $_.Name.Length } | Measure-Object -Maximum | Select-Object -Property Maximum).Maximum + 2
# determin the widest package version for column padding
[int32] $versionPadding = ($updates | ForEach-Object { [math]::Max($_.Current.Length, $_.Available.Length) } | Measure-Object -Maximum | Select-Object -Property Maximum).Maximum + 2
# const status width padding
[int32] $statusWidth = 42  # ironic? or cosmic? =P

# write table column titles
Write-Host
Write-Host "Name".PadRight($namePadding, ' ')  "Version".PadLeft($versionPadding, ' ') "Available".PadLeft($versionPadding, ' ') "  Status"
Write-Host ("-" * $namePadding) ("-" * $versionPadding) ("-" * $versionPadding) " " ("-" * $statusWidth)
Write-Host

# process each package
foreach ($pacakge in $updates) {
    # output package info coumns
    Write-Host $pacakge.Name.PadRight($namePadding) $pacakge.Current.PadLeft($versionPadding, ' ') $pacakge.Available.PadLeft($versionPadding, ' ') "- " -NoNewline

    # check if package should be skipped?
    if ($pacakge.Skip) {
        # output package status
        Write-Host "skipping" -ForegroundColor DarkYellow
        if ($upgrade) { Write-Host }
    } else {
        # check if package version is unknown
        if ($pacakge.Current -eq "Unknown") {
            # output package status
            Write-Host "skipping unkown version, check manually" -ForegroundColor Cyan
            if ($upgrade) { Write-Host }
        } else {
            # temporary check if any properties have unicode garbled text
            # this is only until winget piped output is fixed or supports power-shell natively
            [bool] $garbled = (
                $pacakge.Name.EndsWith("GÇ") -or
                $pacakge.Id.EndsWith("GÇ") -or $pacakge.Id.StartsWith("ª ") -or
                $pacakge.Current.EndsWith("GÇ") -or $pacakge.Current.StartsWith("ª ") -or
                $pacakge.Available.EndsWith("GÇ") -or $pacakge.Available.StartsWith("ª ") -or
                $pacakge.Source.EndsWith("GÇ") -or $pacakge.Source.StartsWith("ª ")
            )

            # check if packages should upgraded
            if ($upgrade) {
                # check if any property is garbled
                if ($garbled) {
                    # output package status and continue to next package
                    Write-Host "skipping, garbled identifiers prevents update" -ForegroundColor Yellow
                } else {
                    # perform pacakge upgrade, capture output
                    [string[]] $result = winget upgrade --name """$($pacakge.Name)""" --id """$($pacakge.Id)""" --version """$($pacakge.Available)"""

                    # check if pacakge upgrade succeeded and output package status accordingly
                    if ($lastExitCode -eq 0) {
                        Write-Host "updated" -ForegroundColor Blue
                    } else {
                        Write-Host "failed to update" -ForegroundColor Red
                        Write-Host
                        # demonstrate command used for upgrade
                        Write-Host ">" winget upgrade --name """$($pacakge.Name)""" --id """$($pacakge.Id)""" --version """$($pacakge.Available)""" -ForegroundColor Yellow
                        # output captured output from package upgrade
                        foreach ($line in $result) {
                            Write-Host $line -ForegroundColor DarkGray
                        }
                    }
                }

                Write-Host
            } else {
                # check if any property is garbled and output package status accordingly 
                if ($garbled) {
                    Write-Host "skipping new version, garbled identifiers prevent update" -ForegroundColor Yellow
                } else {
                    Write-Host "new version available" -ForegroundColor Blue
                }
            }
        }
    }
}

Write-Host

Benutzeravatar
Holgi
Elite
Elite
Beiträge: 2113
Registriert: 12.05.2018, 12:33
Hat sich bedankt: 207 Mal
Danke erhalten: 273 Mal
Gender:

Re: Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

Beitrag von Holgi » 09.01.2022, 15:46

funktioniert super! Danke! Danke :dankeschoen:
Mal ´ne Frage:
habt ihr das Script auch mal mit einer Skip-Liste ausprobiert, so wie von Nejat (dem Ursprungssauthor) vorgesehen? Wie ist da der Aufruf?
PDF24 angepasste Installation (nur PDF Druckertreiber) per Script: viewtopic.php?t=30284
Winget (Desktop App Installer) für Windows Versionen ohne Store installieren (HowTo): viewtopic.php?t=26214
Vorstellung: tiny11builder; Script zur Verschlankung von Windows 11: viewtopic.php?t=30134
Windows StartMenü Empfohlen (Recommended Section) komplett ausblenden: viewtopic.php?t=30574
Hyper-V VM per Script erstellen viewtopic.php?t=25114

Antworten