[EX] Gestionnaire de Mise à jour Winget [IA]
Posté : mer. 07 août 2024 18:22
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)
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
#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