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

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: [gelöst] Winget versucht Apps immer und immer wieder neu zu installieren, wenn die Versionsnummer "unknown" ist.

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

von Holgi » 27.01.2022, 15:35

Hi DK2000! Das sind ja tolle Neuigkeiten; ich meine, dass du das Script selber schon vorhattest umzuschreiben.
Vlt. ginge es, wenn man anstelle des Namens, immer die ID nehmen würde?
Das wäre dann beim VCREdistX86 dann Microsoft.VC++2015-2022Redist-x86 und entsprechend kürzer.
Ich bin gespannt.

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

von DK2000 » 27.01.2022, 13:14

Den Script wollte ich eh neu schreiben. Bin aber noch nicht allzu weit gekommen, außer die Liste der Updates zur Verfügung zu stellen. Muss mir mal eine VM mit veralteter Software einrichten, dass ich da mal eine vernünftige Liste an Updates zusammen bekomme. Hier jetzt warten, bis mal wieder ein Update kommt, dauert zu lange und das Ganze gerät in Vergessenheit (Das Wetter in der Powershell anzuzeigen, fand ich interessanter :o ).

Und ja, das Problem mit den "Microsoft Visual C++ 2015-2022" weiß ich auch noch nicht so genau, wie ich das lösen könnte. Aber habe da schon einen Einfall. Muss mal schauen, was ich daraus mache. Die neuen .NETS haben da auch so ihre Probleme.

Damit das mit dem "Microsoft Visual C++ 2015-2022" mit dem Script klappt, muss man den Namen oder die ID fixen:

Code: Alles auswählen

"Microsoft Visual C++ 2015-2022 Redistributable (xÔÇ" -> "Microsoft Visual C++ 2015-2022 Redistributable (x86)"
"ª Microsoft.VC++2015-2022Redist-x8" -> "Microsoft.VC++2015-2022Redist-x86"

Code: Alles auswählen

"Microsoft Visual C++ 2015-2022 Redistributable (xÔÇ" *> "Microsoft Visual C++ 2015-2022 Redistributable (x64)"
""ª Microsoft.VC++2015-2022Redist-x6" -> "Microsoft.VC++2015-2022Redist-x64"
Mit den abgehakten Namen einschließlich Sonderzeichen in der Form kann Winget nichts anfangen.

Und hier kommt dann noch hinzu das sich die ID für die Pakete geändert hat:

Bei mir installiert:

Code: Alles auswählen

Name                                                               ID                                     Version
-----------------------------------------------------------------------------------------------------------------------
Microsoft Visual C++ 2015-2022 Redistributable (x86) - 14.30.30708 {52ad9b34-7229-4fa5-b36d-bbe3393d7f20} 14.30.30708.0
Microsoft Visual C++ 2015-2022 Redistributable (x64) - 14.30.30708 {ee198d9f-cfe1-4f8a-bf5f-7b1be355b63d} 14.30.30708.0
Neue Version übe Winget:

Code: Alles auswählen

Name                                                 ID                                Version       Quelle
------------------------------------------------------------------------------------------------------------
Microsoft Visual C++ 2015-2022 Redistributable (x86) Microsoft.VC++2015-2022Redist-x86 14.31.31103.0 winget
Microsoft Visual C++ 2015-2022 Redistributable (x64) Microsoft.VC++2015-2022Redist-x64 14.31.31103.0 winget
Dadurch dass sich die ID geändert hat, führt Winget kein Update von 14.30.30708.0 auf 14.31.31103.0 aus, da das aus dessen Sicht unterschiedliche Sachen sind. Mal schauen, wie sich das entwickelt.

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

von Holgi » 27.01.2022, 12:32

mein Fehler! upgrade war nicht auf $true gesetzt.
Dennoch habe ich noch einen Fehler entdeckt:

Code: Alles auswählen

Microsoft Visual C++ 2015-2022 Redistributable (xÔÇ     6 14.30.30704.   0 14.31.31103. - failed to update

> winget upgrade --name "Microsoft Visual C++ 2015-2022 Redistributable (xÔÇ" --id "ª Microsoft.VC++2015-2022Redist-x8" 

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

von Holgi » 27.01.2022, 07:49

ups! ich habe gerade festgestellt, dass das Sript doch nicht so arbeitet wie vorgesehen:
Die anstehenden Updates bei Apps deren Version nicht "unknown" sind, werden nicht durchgeführt.
Das habe ich jetzt erst bemerkt, da bei mir eigentlich ein Update von Winrar anstehen würde.
Das Script zeigt auch an: "new Version available" installiert dieses aber nicht.
Könnt ihr mir da noch mal helfen?

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

von Blondi_2021 » 09.01.2022, 19:05

hab gelernt können nur Admins ;bzw moinmoin Gumfuci usw @Holgi

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

von Holgi » 09.01.2022, 18:55

danke upapi! sleep 5 und pause funktionieren.
Ich würde das Thema auf [gelöst] setzen, weiß aber nicht wie das geht.

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

von upapi » 09.01.2022, 17:20

Oder du ergänzt im upgrade script am Ende ein "sleep 5", dann bleibt die Konsole 5 Sekunden stehen
Oder du ergänzt im upgrade script ein "pause", dann bleibt solange stehen bis du eine Taste drückst
:-)

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

von upapi » 09.01.2022, 17:16

MMhh; ich kenne nur den Schalter -NoExit, dann wird die Konsole nicht geschlossen; vermutlich gleich hinter dem ersten PowerShell.exe

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

von Holgi » 09.01.2022, 17:05

ein ´hab ich noch, ein ´hab ich noch:
ich habe auf meinem Desktop ein *.cmd Skript, welches ich beim ersten Start des Rechners am Tag aufrufe. Da werden dann die Windows Updates, MS Store Updates, PortableApps Updates und eben auch die Winget Updates aufgerufen.
Wenn es sich dabei um ein PS-Script handelt, dann eben so:

Code: Alles auswählen

PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%~dpn0.ps1""' -Verb RunAs}"
bzw.

Code: Alles auswählen

PowerShell.exe -NoProfile -Command "& {Start-Process PowerShell.exe -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File ""%~dp0winget updates.ps1""' -Verb RunAs}"
An welcher Stelle im PS-Script muss/kann man und wie eine Pause setzen, damit einem das Ergebnis der Prüfung angezeigt wird?
Wenn ich es so aufrufe (ohne Pause), dann ploppt das Powershell Fenster auf, aber ich sehe nicht, ob da Updates "geskippt" werden.

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

von Holgi » 09.01.2022, 16:31

Klasse!! Super! Mein Tag ist gerettet!

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

von upapi » 09.01.2022, 15:56

Ja, klappt einwandfrei. Einfach im selben Verzeichnis wie das script eine Datei "winget-skiplist" ohne extention anlegen. Den Namen der Datei kann man auch im script (Zeile 3) anpassen. In der Datei die Namen (nicht die ID!) der zu überspringenden Apps eintragen. Voila, es wird geskippt.

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

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?

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

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

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

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.

Nach oben