VBS Script in Autoit GUI

  • Hallo
    wer kann mir bei diesem VBS Script bei der Übersetzung helfen damit ich es in Autoit in eine GUI einbinden kann (einfacher weil man dann sehen kann was passiert :P

    Spoiler anzeigen

    Set updateSession = CreateObject("Microsoft.Update.Session")
    updateSession.ClientApplicationID = "MSDN Sample Script"

    Set updateSearcher = updateSession.CreateUpdateSearcher()

    WScript.Echo "Searching for updates..." & vbCRLF

    Set searchResult = _
    updateSearcher.Search("IsInstalled=0 and Type='Software' and IsHidden=0")

    WScript.Echo "List of applicable items on the machine:"

    For I = 0 To searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    WScript.Echo I + 1 & "> " & update.Title
    Next

    If searchResult.Updates.Count = 0 Then
    WScript.Echo "There are no applicable updates."
    WScript.Quit
    End If

    WScript.Echo vbCRLF & "Creating collection of updates to download:"

    Set updatesToDownload = CreateObject("Microsoft.Update.UpdateColl")

    For I = 0 to searchResult.Updates.Count-1
    Set update = searchResult.Updates.Item(I)
    addThisUpdate = false
    If update.InstallationBehavior.CanRequestUserInput = true Then
    WScript.Echo I + 1 & "> skipping: " & update.Title & _
    " because it requires user input"
    Else
    If update.EulaAccepted = false Then
    WScript.Echo I + 1 & "> note: " & update.Title & _
    " has a license agreement that must be accepted:"
    WScript.Echo update.EulaText
    WScript.Echo "Do you accept this license agreement? (Y/N)"
    strInput = WScript.StdIn.Readline
    WScript.Echo
    If (strInput = "Y" or strInput = "y") Then
    update.AcceptEula()
    addThisUpdate = true
    Else
    WScript.Echo I + 1 & "> skipping: " & update.Title & _
    " because the license agreement was declined"
    End If
    Else
    addThisUpdate = true
    End If
    End If
    If addThisUpdate = true Then
    WScript.Echo I + 1 & "> adding: " & update.Title
    updatesToDownload.Add(update)
    End If
    Next

    If updatesToDownload.Count = 0 Then
    WScript.Echo "All applicable updates were skipped."
    WScript.Quit
    End If
    WScript.Echo vbCRLF & "Downloading updates..."

    Set downloader = updateSession.CreateUpdateDownloader()
    downloader.Updates = updatesToDownload
    downloader.Download()

    Set updatesToInstall = CreateObject("Microsoft.Update.UpdateColl")

    rebootMayBeRequired = false

    WScript.Echo vbCRLF & "Successfully downloaded updates:"

    For I = 0 To searchResult.Updates.Count-1
    set update = searchResult.Updates.Item(I)
    If update.IsDownloaded = true Then
    WScript.Echo I + 1 & "> " & update.Title
    updatesToInstall.Add(update)
    If update.InstallationBehavior.RebootBehavior > 0 Then
    rebootMayBeRequired = true
    End If
    End If
    Next

    If updatesToInstall.Count = 0 Then
    WScript.Echo "No updates were successfully downloaded."
    WScript.Quit
    End If

    If rebootMayBeRequired = true Then
    WScript.Echo vbCRLF & "These updates may require a reboot."
    End If

    WScript.Echo vbCRLF & "Would you like to install updates now? (Y/N)"
    strInput = WScript.StdIn.Readline
    WScript.Echo

    If (strInput = "Y" or strInput = "y") Then
    WScript.Echo "Installing updates..."
    Set installer = updateSession.CreateUpdateInstaller()
    installer.Updates = updatesToInstall
    Set installationResult = installer.Install()
    'Output results of install
    WScript.Echo "Installation Result: " & _
    installationResult.ResultCode
    WScript.Echo "Reboot Required: " & _
    installationResult.RebootRequired & vbCRLF
    WScript.Echo "Listing of updates installed " & _
    "and individual installation results:"
    For I = 0 to updatesToInstall.Count - 1
    WScript.Echo I + 1 & "> " & _
    updatesToInstall.Item(i).Title & _
    ": " & installationResult.GetUpdateResult(i).ResultCode
    Next
    End If

    Bin für jede Unterstützung sehr dankbar.

    • Offizieller Beitrag

    Habs mal portiert, inwiefern es funktioniert musst du testen.

  • SUPER
    danke dir habe es gerade getestet und es macht was es soll einfach Klasse, nun hätte ich noch eine Frage habe alles was ConsoleWrite ist in meiner Form in die Statusbar geschrieben, wie kann ich nun nur noch anzeigen lassen in einem Listview was für Updates gefunden wurden und welche installiert werden können.

    Einmal editiert, zuletzt von Holzmichel (11. September 2016 um 21:58)

  • Hi alle

    es geht um folgendes Script Schnipsel

    Spoiler anzeigen


    For $i = 0 To $searchResult.Updates.Count-1

    $update = $searchResult.Updates.Item($i)

    Wie kann ich hier das Ergebnis in ein Listview ausgeben mit einem Icon von der Shell32.dll ???

    Wäre Toll wenn mir jemand dabei helfen könnte.

    • Offizieller Beitrag

    Mal aus der Hüfte geschossen. Listview-UDF und WinAPI.au3 mußt du includieren und dann in deine GUI einbauen.
    Wenn du das Listview mit Checkboxen gestaltest, kann der User damit auswählen. Mußt dann den Status der Checkboxen in der Funktion _RunUpdates abfragen und entsprechend installieren.

    • Offizieller Beitrag

    Beim Klick auf Listview, ist es mit Checkbox wird dabei die Checkbox aktiviert und gleichzeitig (wenn erforderlich) Eula angezeigt und zum Bestätigen aufgefordert.

    • Offizieller Beitrag

    besteht die Möglichkeit nur bestimmte Updates zu installieren ?

    Verwende Listview mit Checkbox-Style, die Checkboxen verwendest du dann zur Auswahl der Updates.
    Du musst dann nur beim Klick auf das Listview auswerten (in der Funktion _AgreeLicense:(
    - die jetzige Auswertung zum Anzeigen/Bestätigen EULA
    - zusätzlich: Wenn EULA abgelehnt wird darf Checkbox des Item nicht aktiviert werden/ bzw. muss wieder deaktiviert werden. Ebenfalls sollten Einträge, die User-Input erfordern (bei LICENSE-AGREE: 'requires user input') nicht aktivierbar sein. Wobei das in erster Linie ein optisches Gimmick ist. Das Update wird sowieso nur dann ausgeführt, wenn: "Checkbox aktiviert" und in License-Agree Eintrag " --" oder "agree".
    Du kannst natürlich das ganze Handling verfeinern und Aktionen für Check/Uncheck berücksichtigen (z.B. wenn Uncheck, wird auch EULA zurückgesetzt), da kannst du dich austoben. ;)

    Dann musst du in der Funktion _CollectUpdates in der Schleife die Abfrage erweitern:
    statt: If $sText = 'agree' Or $sText = ' --' Then $updatesToDownload.Add($searchResult.Updates.Item($i))
    erweitert: If ($sText = 'agree' Or $sText = ' --') And _GUICtrlListView_GetItemChecked($hListview, $i) Then $updatesToDownload.Add($searchResult.Updates.Item($i))

  • Hi danke erstmal für deine sehr gute Hilfe aber da ich immer noch am versuchen bin und es einfach nicht klappen.

    Spoiler anzeigen


    Func _AgreeLicense($searchResult)
    Local $update, $aIndex = _GUICtrlListView_GetSelectedIndices($hListview, True)
    If $aIndex[0] = 0 Then Return
    For $i = 1 To $aIndex[0]
    If _GUICtrlListView_GetItemText($hListview, $aIndex[$i], 1) = 'click to agree' Then
    $update = $searchResult.Updates.Item($i-1)
    If MsgBox(36, 'LIZENZ-OK', $update.EulaText) = 6 Then
    _GUICtrlListView_SetItemText($hListview, $aIndex[$i], 'agree', 1)
    _AgreeLicense($update)
    _WinAPI_RedrawWindow($hListview)
    EndIf
    EndIf
    Next
    EndFunc

    Func _CollectUpdates($searchResult)
    Local $updatesToDownload = ObjCreate("Microsoft.Update.UpdateColl")
    Local $sText, $iCount = _GUICtrlListView_GetItemCount($hListview)
    If $iCount = 0 Then Return
    For $i = 0 To $iCount -1
    $sText = _GUICtrlListView_GetItemText($hListview, $i, 1)
    If ($sText = 'agree' Or $sText = ' --') And _GUICtrlListView_GetItemChecked($hListview, $i) Then $updatesToDownload.Add($searchResult.Updates.Item($i))
    Next
    If $updatesToDownload.Count = 0 Then
    Return SetError(1,0,0)
    Else
    Return $updatesToDownload
    EndIf

    EndFunc

    Habe es versucht klappt nicht leider, und bei der Funktion _AgreeLicense weis ich nicht wo ich was eintragen soll. und bei

    Spoiler anzeigen
    • While 1
    • Switch GUIGetMsg()
    • Case -3
    • Exit
    • Case $idListview
    • _AgreeLicense() <-----------------------------------Hier sind zu wenig Argumente sagt die Fehlermeldung
    • Case ... Button 'Prüfen auf Updates'
    • $oUpdates = _CheckAvailableUpdates()
    • If @error Then
    • MsgBox(0, 'Error', 'No updates available.')
    • Else
    • _ShowUpdatesInListview($idListview, $oUpdates)
    • EndIf
    • Case ... Button 'Updates durchführen'
    • $oToUpdate = _CollectUpdates($oUpdates)
    • If Not @error Then _RunUpdates($oToUpdate)
    • EndSwitch
    • WEnd


    Verzweifel

    • Offizieller Beitrag

    und bei der Funktion _AgreeLicense weis ich nicht wo ich was eintragen soll

    Wie gesagt, habe alles aus der Hüfte geschossen. Deshalb tritt auch mal ein Fehler auf. :whistling:
    An die Funktion musst du das Ergebnis der Updatezusammenstellung übergeben $oUpdates, dann sollte es auch funktionieren.