FTP

  • Hallo,
    derzeit habe ich folgendes Problem und ich hoffe das mir hier geholfen werden kann.

    Also mein Problem ist das ich per _FTP..... mehrere Verbindungen gleichzeitig aufbauen möchte um Zeit zu sparen, da ich in einer gewissen Zeit Daten auf mehrere FTP Server übertragen muss.

    Derzeit führe ich jede FTP Verbindung nach und nach durch mittels einer Liste wo die Ziele drin stehen und er eine nach der anderen Zeile abarbeitet.
    Für kleine Datenmengen ist das auch kein Problem nun muss ich aber in der Firma weit aus über 300 MB Daten übertragen und habe für 50 Übertragungen nur ca. 12 Stunden zeit.
    Für jede Übertragung benötige ich pro Ziel ca. 40 Min, also wäre ich bei 33 Std.

    Da Windows 7 ja 10 FTP Verbindungen gleichzeitig aufbauen kann würde ich diese gerne nutzen doch ich komme keinen Schritt weiter.

    Also wäre die Ausgangslage wie folgt.
    Script öffnet die Datei mit den Zielen und soll nun für die ersten 10 eine FTP Session öffnen und übertragen, sobald diese alle beendet sind soll das Script die nächsten 10 abarbeiten bis die Liste abgearbeitet ist.

    Ich habe das ganze auch schon so versucht das ich per Script diese Liste abarbeite und für das Bordmittel FTP.exe für jedes Ziele ein Antwort Datei im ersten Schritt erstelle.
    Ich bekomme es auch dann wieder hin das ich diese nach und nach wieder abarbeiten kann.

    Ich müsste aber folgendes haben wenn es per AutoIt intern nicht gehen sollte.

    1. Erstellen der Antwortdateien (klappt)
    2. Auf Grundlage der Antwortdateien 10 FTP Verbindungen mittel FTP.EXE und der Antwortdateien aufbauen und Daten übertragen
    3. Überwachen vom Prozess cmd.exe ( da ich FTP.EXe in einen neuem Fenster starte ), sobald es keinen solchen Prozess gibt soll er die nächsten 10 Zeilen abarbeiten.

    Ich hoffe das ich mich verständlich ausgedrückt habe und ihr mir helfen könnt.

  • Also so wie ich das sehe liegt dein Problem mit den _FTP..... Funktionen darin, dass diese nicht über mehrere Verbindungen gleichzeitig Daten übertragen können. Anstatt das über die FTP.exe zu lösen, könntest du auch folgendes probieren: Du hast ein "Koordinationsscript". Dieses startet dann 10 mal ein "Übertragungsscript". Diese Scripte können dann miteinander kommunizieren, sprich das Übertragungsscript bekommt vom Koordinationsscript das Ziel und die Daten die es übertragen soll und es kann auch melden sobald es fertig ist. Jedes Übertragungsscript kann dann mit den standard AutoIt UDF's parallel die Daten übertragen. Das ist jetzt so spontan die 'einfachste' Lösung und du kannst auch völlig bei AutoIt bleiben.

    Gruss Shadowigor

  • Das mit den beiden Scripten hört sich gut an, aber ich finde keinen Lösungsansatz.
    Darauf hin habe ich mal etwas überlegt und einen kleinen Teilerfolg erzielt.
    Anbei habe ich mal die Scripte mit beigefügt.
    Dabei kopiert es das eine Script um, mit den Dateinamen aus der Zeile und startet es mit dem Parameter der Zeile.
    Das macht das Script so lange bis es die Zeile 10 oder 20 erreicht und pausiert solange bis der Prozess aus Zeile 10 oder 20 beendet ist und fährt weiter fort.
    Script Nummer zwei übernimmt den Parameter.

    Kann mir noch jemand sagen wie ich vielleicht das SCript so stricken kann, das 10 Prozesse startet und sobald einer beendet ist den nächsten startet, ansonsten könnte ich damit auch erstmal leben.

  • Also ich habe jetzt mal ein kleines Beispiel geschrieben. So würde ich es machen. Ich garantiere aber für nichts. Kann es leider nicht testen, da ich gerade kein Windows zur Hand habe.

    Spoiler anzeigen
    [autoit]


    Local $pid[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    Local $Liste, $Ziel, $i, $Fertig

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

    ; Öffne die Liste
    $Liste = FileOpen("C:\daten\Autoit\Liste.txt", 0)
    ; Eine Variable, die sagt ob alles abgearbeitet ist
    $Fertig = 0

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

    While Not $Fertig
    ; Die nächste Zeile einlesen
    $Ziel = FileReadLine($Liste)

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

    ; Wenn die Liste fertig ist, setzten wir die Variable.
    If $Ziel = "" Then
    $Fertig = 1
    EndIf

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

    Do
    ; Gehe die Liste der Arbeiterprozesse durch
    For $i = 0 To 9
    ; Am anfang oder wenn der zuvor gestartete Prozess fertig ist mit arbeiten,
    If $pid[$i] = 0 Or Not ProcessExists($pid[$i]) Then
    ; wird der nächste Eintrag der Liste gestartet
    If $Ziel <> "" Then
    ; Starte einen neuen Prozess
    $pid[$i] = Run("C:\Daten\AutoIt\Olaf.exe " & $Ziel)
    ; Damit wir wissen, dass dieses Ziel jetzt bearbeitet wird
    $Ziel = ""
    ExitLoop
    EndIf
    Else
    ; Sollte ein Prozess noch laufen, sind wir sicher noch nicht fertig
    $Fertig = 0
    EndIf
    Next
    ; Damit wir den Prozessor nicht zu arg belasten
    Sleep(10)
    ; Das ganze müssen wir so lange machen bis ein Prozess frei
    ; geworden ist und wir das nächste Ziel einlesen können
    While $Ziel <> ""
    WEnd

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

    FileClose($Liste)

    [/autoit]


    Ich hoffe die Kommentare sind einigermassen verständlich ;)

  • Hallo Shadowigor
    leider läuft sie nicht, da er 2 fehler ausgibt.

    Es fehlt ein WEnd vor FileClose, dieses habe ich gesetzt.
    Doch er will noch ein until für die Do Schleife.

    Habe aber leider keine Ahnung wo ich das ganze hin packen soll.

  • Upps, da hab ich wohl etwas zu viel C programmiert in letzter Zeit ^^ . Das While sollte eigentlich ein Until sein. Also so:

    Spoiler anzeigen
    [autoit]


    Local $pid[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    Local $Liste, $Ziel, $i, $Fertig

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

    ; Öffne die Liste
    $Liste = FileOpen("C:\daten\Autoit\Liste.txt", 0)
    ; Eine Variable, die sagt ob alles abgearbeitet ist
    $Fertig = 0

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

    While Not $Fertig
    ; Die nächste Zeile einlesen
    $Ziel = FileReadLine($Liste)

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

    ; Wenn die Liste fertig ist, setzten wir die Variable.
    If $Ziel = "" Then
    $Fertig = 1
    EndIf

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

    Do
    ; Gehe die Liste der Arbeiterprozesse durch
    For $i = 0 To 9
    ; Am anfang oder wenn der zuvor gestartete Prozess fertig ist mit arbeiten,
    If $pid[$i] = 0 Or Not ProcessExists($pid[$i]) Then
    ; wird der nächste Eintrag der Liste gestartet
    If $Ziel <> "" Then
    ; Starte einen neuen Prozess
    $pid[$i] = Run("C:\Daten\AutoIt\Olaf.exe " & $Ziel)
    ; Damit wir wissen, dass dieses Ziel jetzt bearbeitet wird
    $Ziel = ""
    ExitLoop
    EndIf
    Else
    ; Sollte ein Prozess noch laufen, sind wir sicher noch nicht fertig
    $Fertig = 0
    EndIf
    Next
    ; Damit wir den Prozessor nicht zu arg belasten
    Sleep(10)
    ; Das ganze müssen wir so lange machen bis ein Prozess frei
    ; geworden ist und wir das nächste Ziel einlesen können
    Until $Ziel = ""
    WEnd

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

    FileClose($Liste)

    [/autoit]
  • Hallo,
    das Script läuft nun an aber bleibt beim ersten Prozess stehen und macht nicht weiter.
    Ich habe dein Script mal geändert da ich mal sehen wollte ob es vielleicht an der zweiten EXE liegt, wovon ich aber nicht ausgegangen bin, aber ich wollte die Prozess ID haben.

    [autoit]

    FileCopy("C:\Daten\AutoIt\Olaf.exe","C:\Daten\AutoIt\exe\"&$Ziel&".exe")
    $pid[$i] = Run("C:\Daten\AutoIt\exe\"&$Ziel&".exe " & $Ziel)
    MsgBox(4,"",$Ziel&$i)

    [/autoit]

    Er kopiert die Datei auch um und startet diese korrekt. in der MsgBox von Hauptscript bekomme ich die ID 12340 al Meldung angezeigt.
    Danach passiert nichts mehr, wenn ich die MsgBox vom anderen Script beende bleibt das Hauptscript im Pauseemodus und ich kann es dann übern TaskManager abbrechen.

    Sprich er startet einmal und geht dann in Wartemodus und bleibt dort.

  • Hmm... Finde ich seltsam. Habs gerade testen wollen aber mein AutoIt spinnt gerade ein wenig und scheitert schon am FileOpen. Kannst du rausfinden wo genau er stecken bleibt? Mach mal In jeder Schleife z.B. ein ConsoleWrite, sprich vor dem Next, dem Until und dem WEnd. Da kannst du auch noch gleich etwas Debug-Erfahrung sammel ^^

  • Hallo,
    meins muss wohl dann auch gesponnen haben.
    wollte das mit dem consolwrite einbauen und dachte mir einfach mal starte mal.
    und siehe da es klappt.

    DANKE
    wenn ich die Anzahl erhöhen will, brauch ich doch nur die Zeile

    [autoit]

    Local $pid[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    [/autoit]

    erhöhen oder nicht ?

    [autoit]

    Local $pid[20] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    [/autoit]
  • Super! Da bin ich ja froh wenn es klappt.

    Ja, fast. Du musst auch noch in der For schleife den Wert erhöhen. Du kannst dort aber auch ein 'UBound($pid) - 1' reintun, dann ermittelt er die Grösse automatisch.

  • Klappt perfekt, werde es mal auf einem W2K3 Server laufen lassen und die Verbindungen auf 50 erhöhen.

    Das einzige was ich noch gemacht habe ist die exe zum Aufbau der Verbindung vorher umkopieren und dann die Kopie starten.
    So kann ich bei Problemen die Verbindung genau abbrechen und müsste nicht alle stoppen.

    Sobald ich Zeit habe und die drei, ja es sind jetzt drei geworden, mal etwas umschreiben und hier posten.

  • Hallo nochmal,
    da ich noch berichte erstellen muss und keine weiteren Scripte schreiben wollte, habe das Script entsprechend erweitert.
    Doch nun habe ich das Problem das er nicht mehr die 10 Verbindungen parallel aufbaut sondern wie vorher alle nach einander.
    Ich bin das SCript schon durchgegangen kann aber so keine Fehler feststelle.
    Bin vielleicht auch etwas Bild geworden in dem Script.
    Wenn mir jemand vielleicht ein Typ geben kann woran es liegen könnte oder was ich daran besser machen kann wäre ich dankbar.

    Spoiler anzeigen
    [autoit]

    #include <FTPEx.au3>
    #include <File.au3>
    #include <Date.au3>
    #include <Array.au3>
    If FileExists("D:\Automatik\RELEASE\Textdateien\status.ok") Then
    ; -------- Löschen nicht mehr benötigter Daten ------------------------------
    FileDelete("D:\Automatik\RELEASE\Temp\*.*")
    FileDelete("D:\Automatik\RELEASE\Berichte\*.*")

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

    ; -------- Erstellen des Datum für die Pflegeprotokolle
    $File = FileOpen("D:\Automatik\RELEASE\Temp\Tag.txt",2)
    If @WDAY = 1 Then
    $letzter_Tag = _DateAdd("D", "-2", _NowCalcDate());Sonntag
    Else
    $letzter_Tag = _DateAdd("D", "-1", _NowCalcDate());Dienstag und Donnerstag
    EndIf
    $Jahr = StringLeft(StringRight($letzter_Tag,8),2)
    $Monat = StringLeft(StringRight($letzter_Tag,5),2)
    $Tag = StringRight($letzter_Tag,2)
    $Datum_neu = $Tag&"."&$Monat&"."&$Jahr
    FileWrite($File, $Datum_neu)
    FileClose($File)

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

    ;----------- Parameter für das gesamte Script ---------------------------
    $Verteilerliste = FileOpen("D:\Automatik\RELEASE\Textdateien\Verteiler.txt",0)
    $nVerteiler = FileReadLine($Verteilerliste)
    $Modulstand = "TOSHIBA 4690 OS V6"
    $error = "F$"

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

    ;-- Prüfen ob es eine neue db460 gibt und erstellen des Verteilers ---------
    $Server = FileGetTime("S:\DB_4690\Export\AEND4690.txt",0,1)
    $Lokal = FileGetTime("D:\Automatik\Release\Textdateien\AEND4690.txt",0,1)
    If $Server > $Lokal Then
    Filecopy("S:\DB_4690\Export\AEND4690.txt","C:\Automatik\Release\Textdateien\AEND4690.txt",1)
    Else
    EndIf
    $aend4690 = FileOpen("D:\Automatik\Release\Textdateien\AEND4690.txt",0)
    $Verteiler = FileOpen("D:\Automatik\Release\Temp\"&$nVerteiler&".txt",2) ; <---- Wird jedesmal neu erstellt aus der $datei

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

    $Zeile = 1
    While 1
    $Liste_aend4690 = FileReadLine($aend4690,$Zeile)
    $String = StringSplit($Liste_aend4690,";")
    ; Verteiler = $String[7]
    ; BKZ = $String[3]
    If $Liste_aend4690 = "" Then
    ExitLoop
    EndIf
    If $String[7] = $nVerteiler Then
    FileWriteLine($Verteiler,$String[3])
    EndIf
    $Zeile = $Zeile +1
    WEnd
    FileClose($aend4690)
    FileClose($Verteiler)

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

    ;---------------------- Starten der Abholung --------------------------------
    Local $pid[10] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    Local $Liste, $Ziel, $i, $Fertig
    $Ende = FileReadLine("D:\Automatik\Release\Temp\"&$nVerteiler&".txt",-1)
    $Liste = FileOpen("D:\Automatik\Release\Temp\"&$nVerteiler&".txt",0)
    ; Eine Variable, die sagt ob alles abgearbeitet ist
    $Fertig = 0

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

    While Not $Fertig
    ; Die nächste Zeile einlesen
    $Ziel = FileReadLine($Liste)

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

    ; Wenn die Liste fertig ist, setzten wir die Variable.
    If $Ziel = "" Then
    $Fertig = 1
    EndIf

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

    Do
    ; Gehe die Liste der Arbeiterprozesse durch
    For $i = 0 To UBound($pid) - 1
    ; Am anfang oder wenn der zuvor gestartete Prozess fertig ist mit arbeiten,
    If $pid[$i] = 0 Or Not ProcessExists($pid[$i]) Then
    ; wird der nächste Eintrag der Liste gestartet
    If $Ziel <> "" Then
    ; Starte einen neuen Prozess
    FileCopy("D:\Automatik\Release\Scripte\Prüfen.exe","D:\Automatik\Release\Temp\"&$Ziel&".exe",1)
    $pid[$i] = Run("D:\Automatik\Release\Temp\"&$Ziel&".exe "&$Ziel)
    ; Damit wir wissen, dass dieses Ziel jetzt bearbeitet wird
    $Ziel = ""
    ExitLoop
    EndIf
    Else
    ; Sollte ein Prozess noch laufen, sind wir sicher noch nicht fertig
    $Fertig = 0
    EndIf
    Next
    ; Damit wir den Prozessor nicht zu arg belasten
    Sleep(5)
    ; Das ganze müssen wir so lange machen bis ein Prozess frei geworden ist und wir das nächste Ziel einlesen können
    Until $Ziel = ""
    WEnd
    FileClose($Liste)
    ProcessWaitClose($Ende&".exe")

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

    ;--------------------- Auswerten der Protokolle und den Bericht senden -------------------------
    $Bericht = FileOpen("D:\Automatik\RELEASE\Berichte\Protokoll.txt",2) ; <---- Wird jedesmal neu erstellt
    $Liste = FileOpen("D:\Automatik\RELEASE\Temp\"&$nVerteiler&".txt",0)
    $File = FileOpen("D:\Automatik\RELEASE\Temp\Tag.txt",0)
    $Datum_soll = FileReadLine($File)
    $aktiv_soll = "A"
    $error_soll = "0"

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

    ; Hier wird der Berichtskopf erstellt
    FileWrite($Bericht, "****************************************************************" & @CRLF)
    FileWrite($Bericht, "* Automatisches Protokolle für die Releaseanhebung *" & @CRLF)
    FileWrite($Bericht, "****************************************************************" & @CRLF)
    FileWrite($Bericht, "* " & @CRLF)
    FileWrite($Bericht, "* Pflegetabelle : "&$nVerteiler&@CRLF)
    FileWrite($Bericht, "* Pflegedatum : "&$Datum_soll&@CRLF)
    FileWrite($Bericht, "* Tagesdatum : "&@MDAY&"."&@MON&"."&@YEAR& @CRLF)
    FileWrite($Bericht, "* Pflegestatus : B " & @CRLF)
    FileWrite($Bericht, "* " & @CRLF)
    FileWrite($Bericht, "****************************************************************" & @CRLF)
    FileWrite($Bericht, " " & @CRLF)

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

    $zeile = 1
    While 1
    $BKZ = FileReadLine($Liste,$Zeile)
    If $BKZ = "" Then
    ExitLoop
    EndIf
    If FileExists("D:\Automatik\Release\Daten\P_"&$BKZ&".dat") Then
    $Daten = FileOpen("D:\Automatik\Release\Daten\P_"&$BKZ&".dat")
    $D_error = StringRight(StringLeft(FileReadLine($Daten, 3), 36),1)
    $D_Aktiv = StringRight(StringLeft(FileReadLine($Daten, 3), 55),1)
    $D_Datum = StringRight(StringLeft(FileReadLine($Daten, 5), 25),8)

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

    If $D_Datum <> $Datum_soll Then
    FileWrite($Bericht, " "&$BKZ&" Pflegetabelle falsches Datum" & @CRLF)
    FileWrite($Bericht, "--------------------------------------" & @CRLF)
    Else
    If $D_Aktiv = $aktiv_soll Then
    FileWrite($Bericht, " "&$BKZ&" Pflegetabelle Aktiv" & @CRLF)
    FileWrite($Bericht, "--------------------------------------" & @CRLF)
    Else
    If $D_error <> $error_soll Then
    FileWrite($Bericht, " "&$BKZ&" Pflegetabelle fehlerhaft" & @CRLF)
    FileWrite($Bericht, " Protokollauszug" & @CRLF)
    $Fehlerzeile = 1
    While 1
    $Fehler = StringLeft(FileReadLine($Daten,$Fehlerzeile),2)
    If $Fehler = "" Then
    ExitLoop
    EndIf
    If $Fehler = $error Then
    FileWrite($Bericht, " ------------------------" & @CRLF)
    FileWrite($Bericht, " "&FileReadLine($Daten,$Fehlerzeile-2)& @CRLF)
    FileWrite($Bericht, " "&FileReadLine($Daten,$Fehlerzeile-1)& @CRLF)
    FileWrite($Bericht, " "&FileReadLine($Daten,$Fehlerzeile)& @CRLF)
    EndIf

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

    $Fehlerzeile = $Fehlerzeile +1
    WEnd
    FileWrite($Bericht, "--------------------------------------" & @CRLF)
    EndIf

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

    EndIf
    EndIf
    Else
    FileWrite($Bericht, " "&$BKZ&" Markt nicht erreichbar oder keine Protokolldatei vorhanden" & @CRLF)
    EndIf
    $Zeile = $Zeile +1
    WEnd
    FileClose($Bericht)

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

    ;FileDelete("D:\Automatik\Release\mail\config\*.*")
    ;FileCopy("D:\Automatik\Release\mail\P_config_mail.xml","D:\Automatik\Release\mail\config\config_mail.xml")
    RunWait(@ComSpec & " /c " & "D:\Automatik\Release\mail\programm\mail_att.exe", "D:\Automatik\Release\mail\programm", @SW_MAXIMIZE)

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

    ;--------------------- Auswerten der Modulstände und den Bericht senden -------------------------
    $Modulstand = "TOSHIBA 4690 OS V6"
    $Modul = FileOpen("D:\Automatik\RELEASE\Berichte\Modulstand.txt",2) ; <---- Wird jedesmal neu erstellt
    $Liste = FileOpen("D:\Automatik\RELEASE\Temp\"&$nVerteiler&".txt",0)
    ; Hier wird der Berichtskopf erstellt
    FileWrite($Modul, "****************************************************************" & @CRLF)
    FileWrite($Modul, "* Automatisches Protokoll der Modulstände *" & @CRLF)
    FileWrite($Modul, "****************************************************************" & @CRLF)
    FileWrite($Modul, "* " & @CRLF)
    FileWrite($Modul, "* Pflegetabelle : "&$nVerteiler&@CRLF)
    FileWrite($Modul, "* Tagesdatum : "&@MDAY&"."&@MON&"."&@YEAR& @CRLF)
    FileWrite($Modul, "* Modulstand : TOSHIBA 4690 OS V6" & @CRLF)
    FileWrite($Modul, "*" & @CRLF)
    FileWrite($Modul, "****************************************************************" & @CRLF)
    FileWrite($Modul, "" & @CRLF)
    FileWrite($Modul, "Fehlerhafte Märkte " & @CRLF)
    FileWrite($Modul, "" & @CRLF)
    ; Abfrage nach den Modulständen innerhalb der Dateien
    $zeile = 1
    While 1
    $BKZ = FileReadLine($Liste,$Zeile)
    If $BKZ = "" Then
    ExitLoop
    EndIf
    If FileExists("D:\Automatik\Release\Daten\M_"&$BKZ&".dat") Then
    $Daten = FileOpen("D:\Automatik\Release\Daten\M_"&$BKZ&".dat")
    $CC = StringStripWS(StringRight(StringLeft(FileReadLine($Daten, 3), 28),18),3)
    $DD = StringStripWS(StringRight(StringLeft(FileReadLine($Daten, 18), 28),18),3)

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

    If $CC = $Modulstand AND $DD = $Modulstand Then
    Else
    FileWrite($Modul, " "&$BKZ&" Modulstände" & @CRLF)
    FileWrite($Modul, " CC: "&$CC& @CRLF)
    FileWrite($Modul, " DD: "&$DD& @CRLF)
    FileWrite($Modul, "-------------------------"& @CRLF)
    EndIf
    Else
    EndIf
    $Zeile = $Zeile +1
    WEnd
    FileWrite($Modul, "" & @CRLF)
    FileWrite($Modul, "****************************************************************" & @CRLF)
    FileWrite($Modul, "* Liste aller Modulstände der Verteilung *" & @CRLF)
    FileWrite($Modul, "****************************************************************" & @CRLF)
    FileWrite($Modul, "" & @CRLF)
    FileClose($Liste)
    $Liste = FileOpen("D:\Automatik\RELEASE\Temp\"&$nVerteiler&".txt",0)
    $Zeile =1
    While 1
    $BKZ = FileReadLine($Liste,$Zeile)
    If $BKZ = "" Then
    ExitLoop
    Else

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

    $wert = 1
    While 1
    $Moduldatei = FileOpen("D:\Automatik\RELEASE\Daten\M_"&$BKZ&".dat",0)
    $Modul_zeile = FileReadLine($Moduldatei,$wert)
    If $Modul_zeile = "" Then
    ExitLoop
    Else
    FileWriteLine($Modul,$Modul_zeile)
    EndIf
    $Wert = $Wert +1
    WEnd

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

    EndIf
    $Zeile = $Zeile +1

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

    WEnd
    FileClose("D:\Automatik\RELEASE\Berichte\Modulstand.txt")
    sleep(1000)
    ;FileDelete("D:\Automatik\Release\mail\config\*.*")
    ;FileCopy("D:\Automatik\Release\mail\M_config_mail.xml","D:\Automatik\Release\mail\config\config_mail.xml")
    sleep(1000)
    RunWait(@ComSpec & " /c " & "D:\Automatik\Release\Mmail\programm\mail_att.exe", "D:\Automatik\Release\Mmail\programm", @SW_MAXIMIZE)
    FileMove("D:\Automatik\RELEASE\Textdateien\status.ok","D:\Automatik\RELEASE\Textdateien\status.nok")
    Else
    EndIf

    [/autoit]