Variable mit shellexeute verbinden

  • Hey leute möchte eine Update Funktion erstellen über meinen FTP Account .
    Mein Code sieht bis jetzt so aus :

    [autoit]

    Case $Button5
    InetGet("ftp://www.xentusxentis.xe.funpic.de",@TempDir & "\Update.txt", 1, 0) ; das programm lädt die update.txt, wo die datei version drin steht
    $file = FileOpen(@TempDir & "\Update.txt", 0); öffen der datei
    $line = FileReadLine($file, 1);speicher zeile 1 in variable
    $line2= FileReadLine($file, 2);speicher zeile 2 in variable
    $ver = "0.0.1"
    If $line = $ver Then ; wenn programm version gleich der txt dann
    MsgBox(64, "Kein Update", "Du hast die neuste Version: (" & $ver & ")")
    FileClose($file);txtdatei schließen
    FileDelete(@TempDir & "\Update.txt");txt datei lösen
    Else ; sonst
    MsgBox(64, "v0.0.2", "Es ist eine Neue Version verfügbar!");informiert das update vorhanden ist
    $fg = MsgBox(4, "v0.0.2", "Möchtest du jetzt Updaten?"); fragt ob updaten will
    If $fg = 6 Then ; Wenn ja/YES geklickt worden ist dann
    InetGet("ftp://www.xentusxentis.xe.funpic.de/files/Xentus Loader.exe" & $line2, $line2, 1, 0) ;hole aktuelle datei (mit dem namen $line2)
    FileDelete(@TempDir & "\Update.txt");löscht datei
    FileClose($file);schliest datei
    EndIf
    Exit 0
    EndIf

    [/autoit]

    In meiner Update.txt steht :
    0.0.1
    Xentus Loader.exe

    Doch er zeigt immer ein Update an ?
    Wie soll ich das Problem lösen

    2 Mal editiert, zuletzt von Xentus (6. November 2011 um 20:04)

  • Lass dir mal $line anzeigen. Denn eigentlich müsste es gehen. Wenn das stimmt mach mal ein ASCII-Array draus und prüf das. Vielleicht sind noch wo nicht-druckbare Zeichen.

    PS. Hab schon mal sowas geschrieben (Hier).

    Gruss Shadowigor

  • Hallo Xentus,

    Hast du schon einmal veruscht ftp://www.xentusxentis.xe.funpic.de in einem Browser aufzurufen. Ich denke nein, denn sonst wüstest du warum es nicht funktioniert. Je nach Art der Anmeldung kann es so klappen:

    Code
    ftp://myuser:mypassword@www.xentusxentis.xe.funpic.de

    User und Passwort müssen natürlich stimmen. Wenn nicht musst du auf die FTP-Funktion

    [autoit]

    _FTP_FileGet

    [/autoit]

    ausweichen. Sieh dir dazu das Beispiel in der Hilfe an,

    mfg autoBert

  • Wozu denn über FTP? HTTP ist dafür viel besser geeignet, weil du keine Login-Daten rausgeben musst, mit denen jemand Unsinn auf deinen Webspace laden (und den nächsten Updatesuchenden verseuchen) kann.

    Oder habe ich etwas übersehen? ;)

    Johannes

    Ich kenn mich mit HTTP-Funktionen (noch) nicht aus, aber auch dort müssen ja irenddwie die Anmeldedaten übergeben werden. Klick auch mal auf den 1.Link in meinem vorherigen Beitrag. Wenn ich das ftp durch http ersetze bekomme ich 404 Seite nicht gefunden.

    mfg autoBert

  • Jap http klappt nicht . Probiere es mal wie AutoBert gesagt hat das mit dem passwort aus . Muss das Passwort denn immer angegeben werden ? Mal ausproben

  • Wenn es jemand intressiert, ich habe vor 2-3 Tagen einen Updater gecodet:

    Updater:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_outfile=updater.exe
    #AutoIt3Wrapper_UseX64=y
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    ; Alle Includes
    #include <GUIConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <array.au3>
    #include <INet.au3>
    #Include <String.au3>
    #include <Crypt.au3>

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

    Global $iVersion = 010000

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

    ; Alle Optionen
    Opt("MustDeclareVars", 1) ; Variablen müssen deklariert werden
    HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8")

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

    ; Alle Globalen Variablen
    Global $oWebTcp, $aVersion, $hGUI, $hProgressGesamt, $hProgressEinzel, $hLabelGesamt, $hLabelEinzel, $hComboVersion, $hButtonDownload, $Temp, $iVersionUpdater, $bUpdateUpdater = False
    Global $sURL = "Dein Verzeichnis auf dem Server, wo die dateien sind"

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

    ; Ermitteln ob es eine neue UpdaterVersion gibt.
    $iVersionUpdater = _INetGetSource($sURL & "updater.txt")
    If $iVersionUpdater= "" Then
    MsgBox(48, "Fehler!", "Es ist ein Fehler aufgetreten oder Sie haben keine Verbindung zum Internet. Bitte überprüffen Sie Ihre Verbindung.")
    EndIf
    If $iVersionUpdater > $iVersion Then
    If MsgBox(68, "Updater?", "Es ist eine neue Version des Updater verfügbar, möchten Sie diesen jetzt Updaten? (Wenn Sie es nicht tun, kann nicht garantiert werden, dass Sie ein Update durchführen können.") = 6 Then
    $bUpdateUpdater = True
    EndIf
    EndIf

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

    ; Die neuste Version ermitteln
    $aVersion = StringSplit(_INetGetSource($sURL & "versions.txt"), ";")
    If $aVersion[1] = "" Then
    MsgBox(48, "Fehler!", "Es ist ein Fehler aufgetreten oder Sie haben keine Verbindung zum Internet. Bitte überprüffen Sie Ihre Verbindung.")
    EndIf
    $aVersion[0] -= 1
    Global $aVersionGui[$aVersion[0] + 1]
    For $i = 2 to $aVersion[0] Step 1
    $aVersion[$i] = StringTrimLeft($aVersion[$i], 1)
    Next
    For $i = 1 to $aVersion[0] Step 1
    $aVersionGui[$i] = StringTrimLeft($aVersion[$i], 8)
    $aVersion[$i] = StringLeft($aVersion[$i], 7)
    Next
    If $bUpdateUpdater = True Then
    $aVersionGui[1] = "Updater V" & StringMid($iVersionUpdater, 1, 2) & "." & StringMid($iVersionUpdater, 3, 2) & "." & StringMid($iVersionUpdater, 5, 2)
    $aVersionGui[0] = 1
    EndIf

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

    ; Die GUI zeichnen
    $hGUI = GUICreate("Updaten", 395, 183, 193, 125)
    $hComboVersion = GUICtrlCreateCombo($aVersionGui[1], 80, 15, 150)
    For $i = 2 To $aVersion[0] Step 1
    GUICtrlSetData(-1, $aVersionGui[$i])
    Next
    $hButtonDownload = GUICtrlCreateButton("Update starten", 250, 13)
    $hProgressGesamt = GUICtrlCreateProgress(10, 80, 360, 25)
    $hProgressEinzel = GUICtrlCreateProgress(10, 140, 360, 25)
    $hLabelGesamt = GUICtrlCreateLabel("Gesamtfortschritt:", 20, 58, 360, 17, $SS_LEFTNOWORDWRAP)
    $hLabelEinzel = GUICtrlCreateLabel("Lade gerade:", 20, 118, 400, 17, $SS_LEFTNOWORDWRAP)
    GUICtrlCreateLabel("Version:", 20, 18, 50)
    GUISetState(@SW_SHOW)

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    MsgBox(48, "Abbruch", "Der Updater wird beendet ohne, dass ein Update durchgeführt wurde...")
    Exit
    Case $hButtonDownload
    ExitLoop
    EndSwitch
    WEnd

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

    If $bUpdateUpdater = False Then
    ; Schauen welche Version ausgewählt wurde
    Global $Version
    For $i = 1 To $aVersion[0] Step 1
    If GUICtrlRead($hComboVersion) = $aVersionGui[$i] Then
    $Version = $aVersion[$i] & "/"
    ExitLoop
    EndIf
    Next

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

    ; Schauen welche Dateine benötigt werden
    Global $hFile, $iDownloads = 0
    $Temp = StringSplit(_INetGetSource($sURL & $Version & "/files " & @CPUArch & ".txt"), ";")
    If $Temp[1] = "" Then
    MsgBox(48, "Fehler!", "Es ist ein Fehler aufgetreten oder Sie haben keine Verbindung zum Internet. Bitte überprüffen Sie Ihre Verbindung.")
    EndIf
    $Temp[0] -= 1
    Global $aFiles[$Temp[0] + 1][2]
    $aFiles[0][0] = $Temp[0]
    For $i = 2 to $Temp[0] Step 1
    $Temp[$i] = StringTrimLeft($Temp[$i], 1)
    Next

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

    ; MD5 - Checksumme überprüffen
    For $i = 1 To $Temp[0] Step 1
    $aFiles[$i][0] = StringTrimRight($Temp[$i], 33)
    $hFile = FileOpen($aFiles[$i][0])
    If StringRight($Temp[$i], 32) = StringTrimLeft(_Crypt_HashData(FileRead($hFile), $CALG_MD5), 2) Then
    $aFiles[$i][1] = False
    Else
    $aFiles[$i][1] = True
    $iDownloads += 1
    EndIf
    FileClose($hFile)
    Next
    If $iDownloads = 0 Then
    MsgBox(48, "Nicht nötig", "Für diese Version müssen Sie keine Daten landen.")
    Exit
    EndIf

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

    ; Schauen ob alle Ordner existieren und sonst erstellen
    Global $aTemp, $sTemp
    For $i = 1 To $aFiles[0][0] Step 1
    $sTemp = ""
    $aTemp = StringSplit($aFiles[$i][0], "/")
    If IsArray($aTemp) And $aFiles[$i][1] = True Then
    For $j = 1 To $aTemp[0] - 1 Step 1
    $sTemp &= $aTemp[$j] & "\"
    Next
    $sTemp = StringTrimRight($sTemp, 1)

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

    If FileExists($sTemp) = 0 Then
    DirCreate($sTemp)
    EndIf
    EndIf
    Next

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

    ; Die Grösse Der Dateien ermitteln
    Global $aSize[$aFiles[0][0] + 1], $aVerhaeltniss[$aFiles[0][0] + 1], $iSize
    For $i = 1 To $aFiles[0][0] Step 1
    $aSize[$i] = InetGetSize($sURL & $Version & $aFiles[$i][0])
    $iSize += $aSize[$i]
    Next

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

    For $i = 1 To $aFiles[0][0] Step 1
    $aVerhaeltniss[$i] = $aSize[$i] / $iSize
    Next
    Else
    Global $aFiles[2][2], $Version, $aSize[2], $aVerhaeltniss[2], $iDownloads
    $aFiles[0][0] = 1
    $aFiles[1][0] = "updaternew.exe"
    $aFiles[1][1] = True
    $Version = ""
    $aSize[1] = InetGetSize($sURL & $Version & $aFiles[1][0])
    $aVerhaeltniss[1] = 1
    $iDownloads = 1
    EndIf

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

    ; Die Dateien Downloaden
    Global $hDownload, $nBytes, $iPercentGesamt, $iPercentEinzel
    For $i = 1 to $aFiles[0][0] Step 1
    If $aFiles[$i][1] = False Then ContinueLoop

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

    $hDownload = InetGet($sURL & $Version & $aFiles[$i][0], $aFiles[$i][0], 1, 1)
    Do
    Sleep(50)
    $nBytes = InetGetInfo($hDownload, 0)
    $iPercentEinzel = Round($nBytes / $aSize[1] * 100, 0)
    GUICtrlSetData($hProgressEinzel, $iPercentEinzel)
    GUICtrlSetData($hProgressGesamt, ($iPercentEinzel * $aVerhaeltniss[$i]) + $iPercentGesamt)
    GUICtrlSetData($hLabelGesamt, "Gesamtfortschritt: " & Round($iPercentEinzel * $aVerhaeltniss[$i] + $iPercentGesamt, 0) & " %")
    GUICtrlSetData($hLabelEinzel, "Lade gerade: " & $aFiles[$i][0] & " (" & $i & "/" & $iDownloads & ") " & $iPercentEinzel & " %")

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

    ; MSG-Abfragen
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    If MsgBox(36, "Achtung!", "Der Download wurde noch nicht beendet. Soll trotzdem beendet werden?", 5) = 6 Then
    Exit
    EndIf
    EndSwitch

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

    ; Die Changelog richten
    If $aFiles[$i][0] = "Changelog.txt" Then
    $hFile = FileOpen("Changelog.txt")
    $sTemp = FileRead($hFile)
    FileClose($hFile)
    $hFile = FileOpen("Changelog.txt", 2)
    FileWrite($hFile, StringReplace($sTemp, @LF, @CRLF))
    FileClose($hFile)
    EndIf

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

    Until InetGetInfo($hDownload, 2) = True
    InetClose($hDownload)
    $iPercentGesamt += Round($iPercentEinzel * $aVerhaeltniss[$i], 0)
    Next

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

    GUICtrlSetData($hProgressGesamt, 100)
    GUICtrlSetData($hLabelGesamt, "Gesamtfortschritt: fertig...")
    GUICtrlSetData($hLabelEinzel, "Lade gerade: fertig...")

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

    If $bUpdateUpdater = False Then
    If MsgBox(68, "Erfolg!", "Das Update wurde erfolgreich durchgeführt! Soll MyNote jetzt gestartet werden?") = 6 Then
    Run($aFiles[1][0])
    EndIf
    Else
    If MsgBox(68, "Erfolg!", "Der Updater wurde erfolgreich geupdatet. Soll das Reguläre Update jetzt durchgeführt werden?") = 6 Then
    Global $sCmdFile, $iDelay = 500
    FileDelete("scratch.bat")
    $sCmdFile = ':loop' & @CRLF _
    & 'del "' & @ScriptDir & '\updater.exe"' & @CRLF _
    & 'if exist "' & @ScriptDir & '\updater.exe" goto loop' & @CRLF _
    & 'rename "' & @ScriptDir & '\updaternew.exe" "updater.exe"' & @CRLF _
    & '"' & @ScriptDir & '\updater.exe"' & @CRLF _
    & 'del "' & @ScriptDir & '\scratch.bat"'
    FileWrite("scratch.bat", $sCmdFile)
    Run("scratch.bat", @ScriptDir, @SW_HIDE)
    Else
    Global $sCmdFile, $iDelay = 500
    FileDelete("scratch.bat")
    $sCmdFile = ':loop' & @CRLF _
    & 'del "' & @ScriptDir & '\updater.exe"' & @CRLF _
    & 'if exist "' & @ScriptDir & '\updater.exe" goto loop' & @CRLF _
    & 'rename "' & @ScriptDir & '\updaternew.exe" "updater.exe"' & @CRLF _
    & 'del "' & @ScriptDir & '\scratch.bat"'
    FileWrite("scratch.bat", $sCmdFile)
    Run("scratch.bat", @ScriptDir, @SW_HIDE)
    EndIf
    EndIf

    [/autoit]

    Die Update-überprüffungsfunktion in deinem Scrip:

    Spoiler anzeigen
    [autoit]


    Global $iVersion = 0001030

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

    Func _Update()
    Local $iUpdate, $bUpdate = False

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

    ; Die neuster Version ermitteln
    $iUpdate = StringSplit(INetGetSource(Dein Verzeichnis auf dem Server, wo die dateien sind & "versions.txt"), ";")
    $iUpdate = StringLeft($iUpdate[1], 7)

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

    ; Überprüffen ob diese Verison neuer ist
    If $iUpdate > $iVersion Then
    $bUpdate = True
    EndIf

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

    If $bUpdate = True Then
    If MsgBox(36, "Update", "Es ist eine neuere Version verfügbar..." & @CRLF & "Möchten Sie jetzt updaten?") = 6 Then
    Run("updater.exe")
    Exit
    EndIf
    EndIf
    EndFunc ; ==> _Update

    [/autoit]

    Du musst einfach folgende Dateien auf dem Server haben:
    - versions.txt
    - updater.txt
    - updaternew.exe
    - Den Ordner mit der Version
    ----- files x86.txt
    ----- files x64.txt
    ----- und die Update-Files

    Die "versions.txt" ist so aufgebaut:
    0001030:0.1.3 (Beta);
    0001011:0.1.1 (Stable);
    Die erste Zahl vor dem Doppelpunkt ist der Oderner wo die UpdateFiles drin sind (dort sind auch diese files drin: files x86.txt, files x64.txt)
    Der Rest zwischen Doppelpunkt und Semilolon ist der Text, der der User sieht

    Die "updater.txt" ist so aufgebaut:
    000102
    Das ist die Version des Updaters (Der Updater kann also sich selbst auch updaten... Natürlich muss dann Die Variable $iVersion angepasst werden)

    Die "files x86.txt" ist so aufgebaut:
    MyNote x86.exe:BB1872D2C35E224CAD9CDFE24098C315;
    img/default/bot_left.jpg:BE2323527B716AC8112835E3990D1059;
    Zuerst ist der Pfad.
    Nach dem Doppelpunkt ist die MD5-Checksumme der Datei (Der updater Vergleicht dann die MD5-Checksumme der lokalen Files mit dieser. Er lädt dann nur die Dateien herunter, die benötigt werden)
    (der Unterschied zwischen "files x86.txt" und "files x64.txt" ist, dass in dem Einten die .exe der 64-Bit version und im anderen die .exe der 32-Bit version gespeichert wird.

    Ich hoffe, ich habe das jetzt einirgermassen verständlich erklärt...^^
    Und ja ich weiss, beim Updater sind zu viele #includes drin... Aber ich bin jetzt zu faul, diese zu entfernen... :)

    Du darfst natürlich diese Script verwenden und auch verändern wenn du willst, ich möchte einfach in den Credits drin stehen... :)
    Und wenn du noch Fragen hast, frag! 8)

  • Jap http klappt nicht .


    Wieso sollte http "nicht klappen"? Gestern hast du uns in der Shoutbox diesen Sourcecode doch genau auf die selbe Art und Weise über deinen Funpic Space gezeigt. 8|

    Lad die update.txt in einen öffentlichen Ordner auf deinem FTP hoch, damit du sie per http://irgendwas.auf.funpic.de/update.txt im Browser aufrufen kannst. Gann klappt's auch mit dem InetGet/InetRead.

  • Doch wie soll ich einen Öffentlichen Ordner erstellen bin nicht gerade der beste in solchen sachen ...

  • Hallo Xenzus,

    du erstellst einen Ordner. Danach änderst du die Dateiberechtigungen auf 644 dann darfst derBesitzer (du) alles, alle anderen aber nur lesen, beides machst du mit einem FTP-Client z.B.: FileZilla.

    mfg autoBert

  • Also ich habe meine Update Funktion sogut wie fertig doch er ladet die Datei nicht von der ftp runter ?
    Habe mir gedacht das ich lieber Shellexecute nehme .

    [autoit]

    InetGet("http://xentusxentis.xe.funpic.de/Update.txt",@TempDir & "\Update.txt", 1, 0) ; das programm lädt die update.txt, wo die datei version drin steht
    $file = FileOpen(@TempDir & "\Update.txt", 0); öffen der datei
    $line = FileReadLine($file, 1);speicher zeile 1 in variable
    $line2= FileReadLine($file, 2);speicher zeile 2 in variable
    Dim $ver = "0.0.1"
    If $line = $ver Then ; wenn programm version gleich der txt dann
    MsgBox(64, "Kein Update verfügbar", "Du hast bereits die neuste Version: (" & $ver & ")")
    FileClose($file);txtdatei schließen
    FileDelete(@TempDir & "\Update.txt");txt datei lösen
    Else ; sonst
    MsgBox(64, "v0.0.2", "Es ist eine Neue Version verfügbar!");informiert das update vorhanden ist
    $fg = MsgBox(4, "v0.0.2", "Möchtest du jetzt Updaten?"); fragt ob updaten will
    If $fg = 6 Then ; Wenn ja/YES klickt worden ist dann
    shellexecute("GuiCtrlRead($line2)")
    FileDelete(@TempDir & "\Update.txt");löscht datei
    FileClose($file);schliest datei
    EndIf
    Exit 0
    EndIf

    [/autoit]

    Doch wie mache ich das jetzt ? Die 2te Zeile in der .txt heißt jetzt z.b. http://www.mediafire.com/blablatest
    Aber wie kann ich es amchen das die Variable ausgelesen wird und in die shellexecute funktion übertragen wird ?

  • Benutze einfach die Variable:

    [autoit]

    ShellExecute($line2)

    [/autoit]

    GuiCtrlRead ist zum Lesen von Daten aus Gui-Controls in eine Variable, du hast aber schon eine Variable mit dem von dir gewünschten Inhalt.

    Dass sich die Datei nicht herunterladen lässt liegt vielleicht daran dass mediafire den AutoIt-Useragenten gesperrt hat. Gib einen korrekten Link an, dann teste ich dies. Meist hilft es den Useragenten zu ändern:

    [autoit]

    HttpSetUserAgent("Mein Useragent")

    [/autoit]

    als Agent trägst du am besten die Werte des Useragenten deines Browsers ein. Zu finden in Hilfe => Über ...

    mfg autoBert

  • [autoit]

    shellexecute("GuiCtrlRead($line2)")

    [/autoit]


    Würde so doch sowieso nicht funktionieren!
    Also wenn müßte das so sein:

    [autoit]

    shellexecute(GuiCtrlRead($line2))

    [/autoit]


    aber wie autoBert ja sagte, nur in einer GUI, die du nicht hast.