[EX] Gestionnaire de Mise à jour Winget [IA]

Partagez vos scripts, et vos applications AutoIt.
Règles du forum
.
Répondre
SurPriseS
Niveau 6
Niveau 6
Messages : 291
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

[EX] Gestionnaire de Mise à jour Winget [IA]

#1

Message par SurPriseS »

Bonjour !
Petit code, généré par IA... Je test pas mal de choses sur les IA depuis quelques jours, je n'est rien touché au code qu'elle à générer...
Tester sur un PC W10, c'est fonctionnel (surement pas parfait !) Je regarde demain sur W11.
Il y'a quelques erreurs, je verrais demain si il arrive à les corriger tout seul...

Pour résumé, il regarde si il y'a des mises à jours logiciels via Winget, les affiches, et propose de les installer (tous ou par selection)

#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <ListViewConstants.au3>
#include <GuiListView.au3>
#include <FileConstants.au3>
#include <Process.au3>
#include <StringConstants.au3>
#include <ProgressConstants.au3>

; Fonction pour vérifier si Winget est installé
Func IsWingetInstalled()
    Local $sOutput = ""
    Local $iExitCode = 0

    $iExitCode = RunWait(@ComSpec & " /c winget --version", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    $sOutput = StdoutRead($iExitCode)

    If $iExitCode = 0 Then
        Return True
    Else
        MsgBox($MB_ICONINFORMATION, "Débug Info", "Code de sortie: " & $iExitCode & @CRLF & "Sortie: " & $sOutput)
        Return False
    EndIf
EndFunc

If Not IsWingetInstalled() Then
    MsgBox($MB_ICONERROR, "Erreur", "Winget n'a pas été détecté sur ce système. Veuillez vous assurer qu'il est installé et accessible via la ligne de commande.")
    Exit
EndIf

; Crée l'interface graphique
$hGUI = GUICreate("Gestionnaire de mises à jour Winget", 600, 450)
$idListView = GUICtrlCreateListView("Application|Version actuelle|Version disponible", 10, 10, 580, 300, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
_GUICtrlListView_SetExtendedListViewStyle($idListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
$idRefresh = GUICtrlCreateButton("Rafraîchir", 10, 320, 100, 30)
$idUpdate = GUICtrlCreateButton("Mettre à jour sélection", 120, 320, 150, 30)
$idUpdateAll = GUICtrlCreateButton("Tout mettre à jour", 280, 320, 150, 30)
$idProgress = GUICtrlCreateProgress(10, 360, 580, 20)
GUICtrlSetState($idProgress, $GUI_HIDE)
$idProgressText = GUICtrlCreateLabel("", 10, 390, 580, 20)
GUICtrlSetState($idProgressText, $GUI_HIDE)
GUISetState(@SW_SHOW)

; Fonction pour obtenir les mises à jour disponibles
Func GetAvailableUpdates()
    Local $sOutput = ""
    Local $aUpdates[0][3]

    Local $iPID = Run(@ComSpec & " /c winget upgrade", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    While 1
        $sOutput &= StdoutRead($iPID)
        If @error Then ExitLoop
    WEnd
    ProcessClose($iPID)

    ; Diviser la sortie en lignes
    $aLines = StringSplit($sOutput, @CRLF, $STR_NOCOUNT)

    ; Trouver l'index de la ligne d'en-tête
    Local $iHeaderIndex = -1
    For $i = 0 To UBound($aLines) - 1
        If StringInStr($aLines[$i], "Nom") And StringInStr($aLines[$i], "ID") And StringInStr($aLines[$i], "Version") Then
            $iHeaderIndex = $i
            ExitLoop
        EndIf
    Next

    ; Si l'en-tête est trouvé, commencer à traiter les lignes suivantes
    If $iHeaderIndex <> -1 Then
        For $i = $iHeaderIndex + 1 To UBound($aLines) - 2  ; Exclure la dernière ligne
            ; Ignorer les lignes vides ou les séparateurs
            If $aLines[$i] = "" Or StringRegExp($aLines[$i], "^[-\s]+$") Then
                ContinueLoop
            EndIf

            ; Extraire les informations pertinentes
            Local $aMatch = StringRegExp($aLines[$i], "^(.*?)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)$", $STR_REGEXPARRAYMATCH)
            If @error Then ContinueLoop  ; Si le motif ne correspond pas, passer à la ligne suivante

            ; Ajouter l'application à la liste des mises à jour
            _ArrayAdd($aUpdates, StringStripWS($aMatch[0], 3) & "|" & StringStripWS($aMatch[4], 3) & "|" & StringStripWS($aMatch[1], 3))
        Next
    EndIf

    Return $aUpdates
EndFunc

; Fonction pour mettre à jour l'interface utilisateur avec les mises à jour disponibles
Func RefreshUpdateList()
    _GUICtrlListView_DeleteAllItems($idListView)

    Local $aUpdates = GetAvailableUpdates()
    For $i = 0 To UBound($aUpdates) - 1
        GUICtrlCreateListViewItem($aUpdates[$i][0] & "|" & $aUpdates[$i][1] & "|" & $aUpdates[$i][2], $idListView)
    Next
EndFunc

; Fonction pour mettre à jour les applications sélectionnées
Func UpdateSelected()
    Local $iCount = _GUICtrlListView_GetItemCount($idListView)
    Local $iSelected = 0
    Local $aSelectedApps[0]

    ; Compter les applications sélectionnées
    For $i = 0 To $iCount - 1
        If _GUICtrlListView_GetItemChecked($idListView, $i) Then
            $iSelected += 1
            _ArrayAdd($aSelectedApps, $i)
        EndIf
    Next

    If $iSelected = 0 Then
        MsgBox($MB_ICONINFORMATION, "Information", "Aucune application sélectionnée.")
        Return
    EndIf

    ; Afficher la barre de progression
    GUICtrlSetState($idProgress, $GUI_SHOW)
    GUICtrlSetState($idProgressText, $GUI_SHOW)

    ; Mettre à jour les applications sélectionnées
    For $i = 0 To UBound($aSelectedApps) - 1
        Local $iIndex = $aSelectedApps[$i]
        Local $sAppName = _GUICtrlListView_GetItemText($idListView, $iIndex, 0)

        ; Mettre à jour le texte de progression
        GUICtrlSetData($idProgressText, "Mise à jour de " & $sAppName & "...")

        ; Mettre à jour la barre de progression
        GUICtrlSetData($idProgress, ($i + 1) / $iSelected * 100)

        ; Exécuter la mise à jour
        Local $cmd = @ComSpec & " /c winget upgrade """ & $sAppName & """"
        RunWait($cmd, "", @SW_HIDE)

        ; Décocher l'application mise à jour
        _GUICtrlListView_SetItemChecked($idListView, $iIndex, False)
    Next

    ; Cacher la barre de progression
    GUICtrlSetState($idProgress, $GUI_HIDE)
    GUICtrlSetState($idProgressText, $GUI_HIDE)

    MsgBox($MB_ICONINFORMATION, "Mise à jour terminée", "Les applications sélectionnées ont été mises à jour.")
    RefreshUpdateList()
EndFunc

; Fonction pour tout mettre à jour
Func UpdateAll()
    Local $iCount = _GUICtrlListView_GetItemCount($idListView)

    ; Cocher toutes les cases
    For $i = 0 To $iCount - 1
        _GUICtrlListView_SetItemChecked($idListView, $i, True)
    Next

    ; Lancer la mise à jour de la sélection
    UpdateSelected()
EndFunc

; Boucle principale
While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $idRefresh
            RefreshUpdateList()
        Case $idUpdate
            UpdateSelected()
        Case $idUpdateAll
            UpdateAll()
    EndSwitch
WEnd
SurPriseS
Niveau 6
Niveau 6
Messages : 291
Enregistré le : jeu. 06 sept. 2007 11:35
Localisation : Finistère sud
Status : Hors ligne

Re: [EX] Gestionnaire de Mise à jour Winget [IA]

#2

Message par SurPriseS »

Je lui est fait faire des mises à jour ce matin :
J'ai fait des tests sur 10 et 11, ça fonctionne plutôt bien, il faudra que je me penche à la main sur quelques détails (il n'arrive pas toujours très bien à séparer les colonnes récupéré dans powershell mais je ne sais même pas si on peut faire mieux....)
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <MsgBoxConstants.au3>
#include <Array.au3>
#include <ListViewConstants.au3>
#include <GuiListView.au3>
#include <FileConstants.au3>
#include <Process.au3>
#include <StringConstants.au3>
#include <ProgressConstants.au3>
#include <Date.au3>

Global $g_bDebugMode = True  ; Activer/désactiver le mode débogage

Func DebugLog($sMessage)
    If $g_bDebugMode Then
        Local $sLogFile = @ScriptDir & "\WingetUpdateManager_Debug.log"
        Local $hFile = FileOpen($sLogFile, $FO_APPEND)
        FileWrite($hFile, _NowCalc() & " - " & $sMessage & @CRLF)
        FileClose($hFile)
    EndIf
EndFunc

Func InitializeWinget()
    DebugLog("Initialisation de Winget")
    Local $sOutput = ""
    Local $iExitCode = RunWait(@ComSpec & " /c winget --version", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    $sOutput = StdoutRead($iExitCode)

    If $iExitCode <> 0 Then
        DebugLog("Erreur: Winget non détecté. Code de sortie: " & $iExitCode)
        MsgBox($MB_ICONERROR, "Erreur", "Winget n'a pas été détecté sur ce système. Veuillez vous assurer qu'il est installé et accessible via la ligne de commande.")
        Exit
    EndIf

    $iExitCode = RunWait(@ComSpec & " /c echo y | winget upgrade", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    $sOutput = StdoutRead($iExitCode)

    If StringInStr($sOutput, "Usage Agreement") Then
        DebugLog("Premier lancement de Winget détecté")
        MsgBox($MB_ICONINFORMATION, "Premier lancement", "Initialisation de Winget effectuée. Veuillez relancer le script.")
        Exit
    EndIf
    DebugLog("Initialisation de Winget terminée avec succès")
EndFunc

InitializeWinget()

$hGUI = GUICreate("Gestionnaire de mises à jour Winget", 800, 450)
$idListView = GUICtrlCreateListView("Application|ID|Version actuelle|Version disponible", 10, 10, 780, 300, BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS))
_GUICtrlListView_SetExtendedListViewStyle($idListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
$idRefresh = GUICtrlCreateButton("Rafraîchir", 10, 320, 100, 30)
$idUpdate = GUICtrlCreateButton("Mettre à jour sélection", 120, 320, 150, 30)
$idUpdateAll = GUICtrlCreateButton("Tout mettre à jour", 280, 320, 150, 30)
$idUpgradeAll = GUICtrlCreateButton("Upgrade All", 440, 320, 100, 30)
$idProgress = GUICtrlCreateProgress(10, 360, 780, 20)
GUICtrlSetState($idProgress, $GUI_HIDE)
$idProgressText = GUICtrlCreateLabel("", 10, 390, 780, 20)
GUICtrlSetState($idProgressText, $GUI_HIDE)
GUISetState(@SW_SHOW)

Func GetAvailableUpdates()
    DebugLog("Récupération des mises à jour disponibles")
    Local $sOutput = ""
    Local $aUpdates[0][4]

    Local $iPID = Run(@ComSpec & " /c winget upgrade", "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    While 1
        $sOutput &= StdoutRead($iPID)
        If @error Then ExitLoop
    WEnd
    ProcessClose($iPID)

    DebugLog("Sortie brute de Winget: " & @CRLF & $sOutput)

    Local $aLines = StringSplit($sOutput, @CRLF, $STR_NOCOUNT)
    Local $bHeaderFound = False
    Local $iNameEndPos, $iIDEndPos, $iVersionEndPos

    For $i = 0 To UBound($aLines) - 1
        If Not $bHeaderFound And StringInStr($aLines[$i], "Nom") And StringInStr($aLines[$i], "ID") And StringInStr($aLines[$i], "Version") Then
            $bHeaderFound = True
            $iNameEndPos = StringInStr($aLines[$i], "ID") - 1
            $iIDEndPos = StringInStr($aLines[$i], "Version") - 1
            $iVersionEndPos = StringInStr($aLines[$i], "Disponible") - 1
            DebugLog("En-tête trouvé. Positions - Nom: " & $iNameEndPos & ", ID: " & $iIDEndPos & ", Version: " & $iVersionEndPos)
            ContinueLoop
        EndIf

        If $bHeaderFound And StringStripWS($aLines[$i], 8) <> "" And Not StringRegExp($aLines[$i], "^[-\s]+$") Then
            If StringRegExp($aLines[$i], "^\s*\d+\s+mises? à jour disponibles?\.?$") Then ExitLoop

            Local $sName = StringStripWS(StringLeft($aLines[$i], $iNameEndPos), 3)
            Local $sID = StringStripWS(StringMid($aLines[$i], $iNameEndPos + 1, $iIDEndPos - $iNameEndPos), 3)
            Local $sVersion = StringStripWS(StringMid($aLines[$i], $iIDEndPos + 1, $iVersionEndPos - $iIDEndPos), 3)
            Local $sAvailable = StringStripWS(StringMid($aLines[$i], $iVersionEndPos + 1), 3)

            ; Supprimer "-€" du nom et des versions
            $sName = StringRegExpReplace($sName, "\s*-\s*€.*$", "")
            $sVersion = StringRegExpReplace($sVersion, "\s*-\s*€.*$", "")
            $sAvailable = StringRegExpReplace($sAvailable, "\s*-\s*€.*$", "")

            ; Supprimer "winget" de la version disponible
            $sAvailable = StringRegExpReplace($sAvailable, "\s*winget\s*$", "")

            If $sName <> "" And $sID <> "" And $sVersion <> "" And $sAvailable <> "" Then
                ReDim $aUpdates[UBound($aUpdates) + 1][4]
                $aUpdates[UBound($aUpdates) - 1][0] = $sName
                $aUpdates[UBound($aUpdates) - 1][1] = $sID
                $aUpdates[UBound($aUpdates) - 1][2] = $sVersion
                $aUpdates[UBound($aUpdates) - 1][3] = $sAvailable
                DebugLog("Mise à jour trouvée: " & $sName & " | " & $sID & " | " & $sVersion & " | " & $sAvailable)
            EndIf
        EndIf
    Next

    DebugLog("Nombre total de mises à jour trouvées: " & UBound($aUpdates))
    Return $aUpdates
EndFunc

Func RefreshUpdateList()
    DebugLog("Rafraîchissement de la liste des mises à jour")
    _GUICtrlListView_DeleteAllItems($idListView)

    Local $aUpdates = GetAvailableUpdates()
    For $i = 0 To UBound($aUpdates) - 1
        GUICtrlCreateListViewItem($aUpdates[$i][0] & "|" & $aUpdates[$i][1] & "|" & $aUpdates[$i][2] & "|" & $aUpdates[$i][3], $idListView)
    Next

    ; Ajuster la largeur des colonnes
    For $i = 0 To 3
        _GUICtrlListView_SetColumnWidth($idListView, $i, $LVSCW_AUTOSIZE_USEHEADER)
    Next

    DebugLog("Liste des mises à jour rafraîchie avec " & UBound($aUpdates) & " éléments")
EndFunc

Func UpdateSelected()
    DebugLog("Début de la mise à jour des applications sélectionnées")
    Local $iCount = _GUICtrlListView_GetItemCount($idListView)
    Local $iSelected = 0
    Local $aSelectedApps[0]

    For $i = 0 To $iCount - 1
        If _GUICtrlListView_GetItemChecked($idListView, $i) Then
            $iSelected += 1
            _ArrayAdd($aSelectedApps, $i)
        EndIf
    Next

    If $iSelected = 0 Then
        DebugLog("Aucune application sélectionnée pour la mise à jour")
        MsgBox($MB_ICONINFORMATION, "Information", "Aucune application sélectionnée.")
        Return
    EndIf

    GUICtrlSetState($idProgress, $GUI_SHOW)
    GUICtrlSetState($idProgressText, $GUI_SHOW)

    For $i = 0 To UBound($aSelectedApps) - 1
        Local $iIndex = $aSelectedApps[$i]
        Local $sAppName = _GUICtrlListView_GetItemText($idListView, $iIndex, 0)
        Local $sAppID = _GUICtrlListView_GetItemText($idListView, $iIndex, 1)

        GUICtrlSetData($idProgressText, "Mise à jour de " & $sAppName & "...")
        GUICtrlSetData($idProgress, ($i + 1) / $iSelected * 100)

        Local $cmd = @ComSpec & " /c winget upgrade --silent --id """ & $sAppID & """"
        DebugLog("Exécution de la commande: " & $cmd)
        RunWait($cmd, "", @SW_HIDE)

        _GUICtrlListView_SetItemChecked($idListView, $iIndex, False)
    Next

    GUICtrlSetState($idProgress, $GUI_HIDE)
    GUICtrlSetState($idProgressText, $GUI_HIDE)

    DebugLog("Mise à jour des applications sélectionnées terminée")
    MsgBox($MB_ICONINFORMATION, "Mise à jour terminée", "Les applications sélectionnées ont été mises à jour.")
    RefreshUpdateList()
EndFunc

Func UpdateAll()
    DebugLog("Début de la mise à jour de toutes les applications")
    Local $iCount = _GUICtrlListView_GetItemCount($idListView)

    For $i = 0 To $iCount - 1
        _GUICtrlListView_SetItemChecked($idListView, $i, True)
    Next

    UpdateSelected()
    DebugLog("Mise à jour de toutes les applications terminée")
EndFunc

Func UpgradeAll()
    DebugLog("Début de la mise à jour globale (Upgrade All)")
    GUICtrlSetState($idProgress, $GUI_SHOW)
    GUICtrlSetState($idProgressText, $GUI_SHOW)
    GUICtrlSetData($idProgressText, "Exécution de winget upgrade --all...")
    GUICtrlSetData($idProgress, 50)  ; Définir la barre de progression à 50%

    Local $cmd = @ComSpec & " /c winget upgrade --all"
    DebugLog("Exécution de la commande: " & $cmd)
    RunWait($cmd, "", @SW_HIDE)

    GUICtrlSetData($idProgress, 100)  ; Définir la barre de progression à 100%
    GUICtrlSetData($idProgressText, "Mise à jour globale terminée")
    Sleep(2000)  ; Attendre 2 secondes pour que l'utilisateur puisse voir le message
    GUICtrlSetState($idProgress, $GUI_HIDE)
    GUICtrlSetState($idProgressText, $GUI_HIDE)

    DebugLog("Mise à jour globale terminée")
    MsgBox($MB_ICONINFORMATION, "Mise à jour terminée", "Toutes les applications ont été mises à jour.")
    RefreshUpdateList()
EndFunc

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            DebugLog("Fermeture de l'application")
            Exit
        Case $idRefresh
            RefreshUpdateList()
        Case $idUpdate
            UpdateSelected()
        Case $idUpdateAll
            UpdateAll()
        Case $idUpgradeAll
            UpgradeAll()
    EndSwitch
WEnd
Répondre