Tool zum Updates installieren - Ein paar Fragen

  • Hi,

    ich habe $i definiert, nun soll dies auch in der Func von Reg1() erscheinen. Jedoch ist es leer. Warum?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <Array.au3>
    #Include <File.au3>
    #include <_ArrayDisplay2D.au3>
    #include <_ArraySort_2ary.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Dim $schluessel1, $installiert, $durchgang, $kb, $array
    Dim $gang[4]
    Dim $array_datum[100][1]
    Global $i

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("AForm1", 633, 447, 193, 115)
    GUIStartGroup()
    $PC_Art_Desktop = GUICtrlCreateRadio("ARadio1", 72, 40, 49, 41)
    $PC_Art_Laptop = GUICtrlCreateRadio("ARadio2", 72, 88, 57, 33)
    GUIStartGroup()
    $Win_XP_Pro = GUICtrlCreateRadio("ARadio3", 176, 56, 81, 25)
    $Win_XP_MCE = GUICtrlCreateRadio("ARadio4", 176, 88, 97, 33)
    GUIStartGroup()
    $IE_6 = GUICtrlCreateRadio("ARadio5", 312, 48, 89, 25)
    $IE_7 = GUICtrlCreateRadio("ARadio6", 312, 96, 97, 25)

    [/autoit] [autoit][/autoit] [autoit]

    $Start = GUICtrlCreateButton("AButton1", 64, 136, 97, 33, 0)
    $Beenden = GUICtrlCreateButton("AButton2", 192, 136, 121, 33, 0)

    [/autoit] [autoit][/autoit] [autoit]

    $PC_Art = GUICtrlCreateLabel("ALabel1", 88, 16, 43, 17)
    $Win_XP = GUICtrlCreateLabel("ALabel2", 184, 16, 43, 17)
    $IE = GUICtrlCreateLabel("ALabel3", 320, 16, 43, 17)

    [/autoit] [autoit][/autoit] [autoit]

    $ListView = GUICtrlCreateListView("Datei|Status", 440, 16, 169, 409)

    [/autoit] [autoit][/autoit] [autoit]

    ;Pfade
    $pfad_PC_Art_Desktop = "V:\Update-Pack\Desktop\"
    $pfad_PC_Art_Laptop = "V:\Update-Pack\Laptop\"
    $pfad_Win_XP_Pro = "V:\Update-Pack\XP Pro\"
    $pfad_Win_XP_MCE = "V:\Update-Pack\XP MCE\"
    $pfad_IE_6 = "V:\Update-Pack\IE 6\"
    $pfad_IE_7 = "V:\Update-Pack\IE 7\"

    [/autoit] [autoit][/autoit] [autoit]

    $schluessel1 = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix"

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;------------------------------------------------------------------------------------------------------------------------------------
    Func _button()
    msgbox(0, "", $gang[1] & " " & $gang[2] & " " & $gang[3])

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $x = 1 to 3
    $durchgang = $gang[$x]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $anzahl = DirGetSize($durchgang, 3)

    [/autoit] [autoit][/autoit] [autoit]

    ;Array ($Filelist) erzeugen (nur Dateinamen)
    Dim $array_datum = 0
    Dim $array_datum[$anzahl[1] + 1][2]
    $array = _FileListToArray($durchgang, "*", 1)

    [/autoit] [autoit][/autoit] [autoit]

    ;Array ($array_quelle) erzeugen (Dateinamen von $Filelist und Datum)
    For $i = 1 to UBound($array)-1
    $array_datum[$i][0] = $array[$i]
    $dateidatum = FileGetTime($durchgang & $array_datum[$i][0], 0, 1)
    $array_datum[$i][1] = $dateidatum
    Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _ArraySort_2ary($array_datum, 1 , 0, False)
    ;~ _ArrayDisplay2D($array_datum, $durchgang)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    For $i = 1 to UBound($array)-1
    ;~ msgbox(0,"",StringLen($array_datum[$i][0]))
    Select
    Case StringLen($array_datum[$i][0]) = 30
    ;~ Msgbox(0,"",$i)
    _Reg1()
    If $installiert = 0 Then ;>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0
    _start1()
    EndIf
    ;~
    ;~ Case StringInStr($array_datum[$i][0], "-v") > 0
    ;~ Msgbox(0,"","2")
    ;~ _Reg2()
    ;~ _start1()

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Case StringInStr($array_datum[$i][0], "WindowsMedia6") > 0
    ;~ Msgbox(0,"","4")
    ;~ _Reg4()
    ;~ _start1()
    ;~
    ;~ Case StringInStr($array_datum[$i][0], "IE7-") > 0
    ;~ Msgbox(0,"","5")
    ;~ _Reg5()
    ;~ _start1()
    ;~
    ;~ Case StringInStr($array_datum[$i][0], "XML-") > 0
    ;~ Msgbox(0,"","6")
    ;~ _Reg6()
    ;~ _start1()

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Case StringInStr($array_datum[$i][0], "WindowsMedia9") > 0
    ;~ Msgbox(0,"","7")
    ;~ _Reg7()
    ;~ _start1()

    [/autoit] [autoit][/autoit] [autoit]

    EndSelect
    ;~ Msgbox(0,"","???")
    Next
    MsgBox(0,"", $i)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ;------------------------------------------------------------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Reg1()
    ;~ For $i = 1 to UBound($array)-1
    ;~ $x = $i
    MsgBox(0,"", $i)
    $kb = StringMid($array_datum[$i][0], 11, 8)
    ;~ msgbox(0,"", $i)
    $reg = RegRead($schluessel1 & "\" & $kb,"Installed")
    If $reg = "1" Then
    $installiert = 1
    ;~ Msgbox(0,$kb,"1")
    GUICtrlCreateListViewItem($kb & "|bereits installiert", $ListView)
    Else
    $installiert = 0
    ;~ Msgbox(0,$kb,"0")
    GUICtrlCreateListViewItem($kb & "|wird installiert", $ListView)
    EndIf
    ;~ Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _start1()
    ;~ For $i = 1 to UBound($array)-1
    ;~ ShellExecuteWait($durchgang & $array_datum[$i][0], "/passive /norestart")
    ;~ msgbox(0,"", $array_datum[$i][0])
    ;~ Next
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $Beenden
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Case $msg = $GUI_EVENT_CLOSE
    Exit

    Case $msg = $Start
    _button()

    Case $msg = $PC_Art_Desktop
    $gang[1] = $pfad_PC_Art_Desktop

    Case $msg = $PC_Art_Laptop
    $gang[1] = $pfad_PC_Art_Laptop

    Case $msg = $Win_XP_Pro
    $gang[2] = $pfad_Win_XP_Pro

    Case $msg = $Win_XP_MCE
    $gang[2] = $pfad_Win_XP_MCE

    Case $msg = $IE_6
    $gang[3] = $pfad_IE_6

    Case $msg = $IE_7
    $gang[3] = $pfad_IE_7
    EndSelect
    WEnd

    [/autoit]
  • So

    [autoit]

    $i = 5
    _test( $i )
    Func _test( $bla )
    msgbox( 0, "", $bla )
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von Daniel W. (29. Mai 2007 um 21:28)

  • Und jedesmal wenn du die Funktion aufrufst wird der Parameter neu übergeben ...
    Guck mal im Tutorial bei parametern

  • BugFix
    ja dies hatte ich vorhin mal, nur ergibt sich da ein Problem.
    Bsp. es sollen 3 Dateien verarbeitet werden

    die Funktion _button() wird aufgerufen, dann werden Teile davon 3x aufgeführt.

    Da nun die Func _Reg1() aus dieser Func _button() aufgerufen wird, wird Func_Reg1() insgesamt 9x aufgerufen.

    Dies ist zu viel

    • Offizieller Beitrag
    Zitat

    Original von Tweaky
    BugFix
    ja dies hatte ich vorhin mal, nur ergibt sich da ein Problem.
    Bsp. es sollen 3 Dateien verarbeitet werden

    die Funktion _button() wird aufgerufen, dann werden Teile davon 3x aufgeführt.

    Da nun die Func _Reg1() aus dieser Func _button() aufgerufen wird, wird Func_Reg1() insgesamt 9x aufgerufen.

    Dies ist zu viel

    Wenn eine Funktion, an der gleichen Stelle, mit oder ohne Parameter aufgerufen wird ändert sich doch nichts an der Anzahl der aufrufe! :hammer:

  • Hi Tweaky,
    Das Problem ist folgendes:
    -Innerhalb einer Funktion definierte Variable ist ausserhalb nicht mehr gültig.
    -Eine Variable wird bei einer For-Scheife automatisch immer lokal definiert.

    Dabei wird also $i innerhalb der Func neu definiert und ist deshalb danach nicht mehr gültig.


    Gruss
    eddy_erpel

  • Bernd
    Func durchläuft die erste Schlefe (1)
    In dieser Schleife wird eine andere Schleife aufgerufen und diese 3x durchlaufen (1) (2) (3)

    Func durchläuft die erste Schlefe (2)
    In dieser Schleife wird eine andere Schleife aufgerufen und diese 3x durchlaufen (4) (5) (6)

    Func durchläuft die erste Schlefe (3)
    In dieser Schleife wird eine andere Schleife aufgerufen und diese 3x durchlaufen (7) ( 8 ) (9)

    also 9x statt 3x

    oder liege ich da voll daneben ?( ;)


    @th.meger
    würde zwar dann laufen, jedoch benötige ich genau die $i von oben.


    EDIT:
    hab die Lösung
    hab $i an $xxx in der 1. Func übergeben und in der 2. Func wieder $xxx an $i übergeben. Hoffe es klappt nun

    [autoit]

    Case StringLen($array_datum[$i][0]) = 30
    $xxx = $i
    _Reg1()
    If $installiert = 0 Then ;>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0
    _start1()
    EndIf

    [/autoit]


    [autoit]

    Func _Reg1()
    $i = $xxx
    $kb = StringMid($array_datum[$i][0], 11, 8)
    $reg = RegRead($schluessel1 & "\" & $kb,"Installed")
    If $reg = "1" Then
    $installiert = 1
    GUICtrlCreateListViewItem($kb & "|bereits installiert", $ListView)
    Else
    $installiert = 0
    GUICtrlCreateListViewItem($kb & "|wird installiert", $ListView)
    EndIf
    ;~ Next
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Wo liegt jetzt der Unterschied zur Lösung die BugFix vorgeschlagen hat?

    [autoit]

    Case StringLen($array_datum[$i][0]) = 30
    _Reg1($i)
    If $installiert = 0 Then ;>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0
    _start1()
    EndIf

    [/autoit]


    [autoit]

    Func _Reg1($i)
    $kb = StringMid($array_datum[$i][0], 11, 8)
    $reg = RegRead($schluessel1 & "\" & $kb,"Installed")
    If $reg = "1" Then
    $installiert = 1
    GUICtrlCreateListViewItem($kb & "|bereits installiert", $ListView)
    Else
    $installiert = 0
    GUICtrlCreateListViewItem($kb & "|wird installiert", $ListView)
    EndIf
    ;~ Next
    EndFunc

    [/autoit]
  • Ups, jetzt wo du es sagst,
    hatte das $i in

    [autoit]

    _Reg1($i)

    [/autoit]

    übersehen.

    Trotzdem Danke 8)
    Es läuft ja nun :rock:

    EDIT:
    Habs nun an einer anderen Stelle gebraucht, aber es klappt nicht so ganz ?(

    Der Wert von $datum_datum[$i](0] soll an die Func _start1() übergeben werden

    [autoit]

    $anzahl = DirGetSize($durchgang, 3)

    [/autoit][autoit][/autoit][autoit]

    ;Array ($Filelist) erzeugen (nur Dateinamen)
    Dim $array_datum = 0
    Dim $array_datum[$anzahl[1] + 1][2]
    Dim $array = 0
    Dim $array[100]
    $array = _FileListToArray($durchgang, "*", 1)
    ;~ _ArrayDisplay($array)

    [/autoit][autoit][/autoit][autoit]

    ;Array ($array_quelle) erzeugen (Dateinamen von $Filelist und Datum)
    For $i = 1 to UBound($array)-1
    $array_datum[$i][0] = $array[$i]
    $dateidatum = FileGetTime($durchgang & $array_datum[$i][0], 0, 1)
    $array_datum[$i][1] = $dateidatum
    Next

    [/autoit][autoit][/autoit][autoit]

    _ArraySort_2ary($array_datum, 1 , 0, False)
    ;~ _ArrayDisplay2D($array_datum, $durchgang)

    [/autoit][autoit][/autoit][autoit]

    $startdatum = UBound($array)
    For $i = 1 to UBound($array)-1
    If $array_datum[$i][1] >= $datum Then
    $startdatum = $i
    ExitLoop
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit]

    For $i = $startdatum to UBound($array)-1
    GUICtrlSetData($fortschritt," ")
    GUICtrlSetData($fortschritt, $speicher & " / " & $updates_gesamt)

    [/autoit][autoit][/autoit][autoit]

    $kb = StringMid($array_datum[$i][0], StringInStr($array_datum[$i][0], "KB"), 8)
    $time = FileGetTime($durchgang & $array_datum[$i][0], 0, 0)
    $time2 = $time[2] & "." & $time[1] & "." & $time[0]

    [/autoit][autoit][/autoit][autoit]

    Select
    Case StringInStr($array_datum[$i][0], "Media-") = "8" ;WindowsMedia-KB911564-x86-DEU.exe
    _Reg1()
    If $installiert = 0 Then
    _start1($array_datum)
    EndIf

    [/autoit][autoit]

    Func _start1($xxx)
    msgbox(0,"", $xxx)
    ;~ msgbox(0,"", $array_datum[$i][0] & " - " & $test)
    ;~ ShellExecuteWait($durchgang & $array_datum[$i][0], "/passive /norestart")
    GUICtrlSetData($item, "|||wurde installiert")
    GUICtrlSetColor(-1,0x000000)
    EndFunc ;==>_start1()

    [/autoit]

    Jedoch kommt die Fehlermeldung
    "ERROR: _start1() called by a previous line with 0 arg(s). Min = 1. First previous line calling this Func is 263."

    Why?

    Oder kann ich die Variable auch direkt verwenden ohne zu übergeben ?(

    Danke :D

    EDIT2: Hat sich schon wieder erledigt :D
    Ich hatte noch andere Aufrufe der _start1() drinnen, in denen ich den Parameter nicht übergeben hatte :tongue:

    • Offizieller Beitrag
    Zitat

    Jedoch kommt die Fehlermeldung
    "ERROR: _start1() called by a previous line with 0 arg(s). Min = 1. First previous line calling this Func is 263."

    Why?

    Oder kann ich die Variable auch direkt verwenden ohne zu übergeben


    Du rufst die Funktion einmal ohne Argument auf, hast sie selbst aber so definiert, dass ein Argument übergeben werden muß.

    Wenn Variablen allgemein deklariert sind ( Global, Dim ) können die Funktionen diese verwenden ohne, dass sie übergeben werden müssen. Sie sind dann aufgrund der Deklaration bekannt.