Dateien auf Änderungen scannen

  • Hi, mal ne frage.

    Ich muss stündlich ein verzeichniss auf änderungen scannen.
    Nach dem Scannen sollte ich eine Nachricht bekommen.
    Und zwar über neue Dateien im verzeichniss.
    Das Verzeichniss ist immer das gleiche, sind unterordner enthalten und wir bekommen von Kunden via DFUE daten rübergeschaufelt.Das Problem ist, unser PC auf dem die Daten ankommen steht in der hintersten Ecke der Firma.
    Es sind zwischenzeitlich mehrere 100 Dateien darin, da sucht man sich täglich dumm und dämlich.


    Wunschgemäss würde das folgendermasen funktionieren.
    Der Ordner wird mitsamt unterordnern durchsucht, schreibt das ergebnis in eine Datei.
    Nach 1 Std. scannt er das verzeichniss wieder und vergleicht die beiden dateien miteinander.
    Die neuen Dateien schreibt er mir in ein File dieses schickt er mir via E-Mail zu.


    Wäre sowas leicht machbar ?

    vielen dank im voraus

    mfg Observer


    Edit BugFix: Hab das mal abgetrennt und als eigenen Thread geöffnet, da es bei den Skripten fehl am Platz war.

    3 Mal editiert, zuletzt von BugFix (26. Juli 2008 um 11:48)

    • Offizieller Beitrag

    Das geht mit der Funktion recht gut:

    Spoiler anzeigen
    [autoit]


    Global $path = @ScriptDir ; Hier den Pfad eintragen, der durchsucht werden soll
    Global $aFiles = _GetFilesFolder_Rekursiv($path, '*', 0), $Diff, $Hit
    Global $Timer = TimerInit()
    While 1
    If TimerDiff($Timer) > 3600000 Then ; 3.600.000 ms = 1 Stunde
    $Diff = ''
    $aFilesDiff = _GetFilesFolder_Rekursiv($path, '*', 0)
    For $i = 1 To $aFilesDiff[0]
    $Hit = True
    For $j = 1 To $aFiles[0]
    If $aFilesDiff[$i] = $aFiles[$j] Then
    $Hit = False
    ExitLoop
    EndIf
    Next
    If $Hit Then $Diff &= $aFilesDiff[$i] & @CRLF
    Next
    MsgBox(0, 'Neue Dateien', $Diff)
    $aFiles = ''
    $aFiles = $aFilesDiff
    TimerInit()
    EndIf
    Sleep(100)
    WEnd

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard); 1 -@CR; 2 -@LF; oder beliebiges Zeichen
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '0'
    $sDelim = @CRLF
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles,1), $sDelim)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles,1)
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]
  • Hi, danke erstmal für die schnelle hilfe.

    Noch eine Frage.

    Es zeigt mir jetzt an Neue Dateien, dort die Namen mit Pfaden der Dateien.

    Allerdings wenn ich bestätige kommt mir das Fenster mit den Neuen Dateien ständig.
    Auch schreibt er mir die Änderung nicht in ein File.

    Hättest mir da auch noch kurz ne Hilfe dazu ?

    Vielen Dank

    mfg Observer

  • Ich weiß nicht wie man das Fenster danach abschält, aber du kannst nach der message Box mit den neuen dateien mit FileWrite alle dateien in eine datei schreiben

    • Offizieller Beitrag

    Da war noch ein kleiner Fehler in dem Script, so geht's jetzt:

    Spoiler anzeigen
    [autoit]


    Global $path = @ScriptDir ; Hier den Pfad eintragen, der durchsucht werden soll
    Global $aFiles = _GetFilesFolder_Rekursiv($path, '*', 0), $Diff, $Hit
    Global $Timer = TimerInit()
    While 1
    If TimerDiff($Timer) > 3600000 Then ; 3.600.000 ms = 1 Stunde
    $Diff = ''
    $aFilesDiff = _GetFilesFolder_Rekursiv($path, '*', 0)
    For $i = 1 To $aFilesDiff[0]
    $Hit = True
    For $j = 1 To $aFiles[0]
    If $aFilesDiff[$i] = $aFiles[$j] Then
    $Hit = False
    ExitLoop
    EndIf
    Next
    If $Hit Then $Diff &= $aFilesDiff[$i] & @CRLF
    Next
    $hFile = FileOpen(@ScriptDir & '\NeueDateien.txt', 1)
    FileWrite($hFile, $Diff)
    FileClose($hFile)
    ;~ MsgBox(0, 'Neue Dateien', $Diff)
    $aFiles = ''
    $aFiles = $aFilesDiff
    $Timer = TimerInit()
    EndIf
    Sleep(100)
    WEnd

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard); 1 -@CR; 2 -@LF; oder beliebiges Zeichen
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '0'
    $sDelim = @CRLF
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles,1), $sDelim)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles,1)
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]
  • Kann man mit dem Skript aus dem ersten Post auch veränderte dateien auflisten

  • Also ich hab ein Verzeichnis auf meinem PC das mehrere Benutzer verwenden. Nun will ich jedes mal wissen, welche dateien verändert wurden. und evtl. was verändert wurde

  • Ist ja Cool, funktioniert echt gut so :

    Spoiler anzeigen

    #include <INet.au3>


    ;===============================================================================
    ;
    ; Function Name: _INetSmtpMailAuth()
    ; Description: Sends an email using SMTP over TCP IP.
    ; Parameter(s): $s_SmtpServer - SMTP server to be used for sending email
    ; $s_FromName - Name of sender
    ; $s_FromAddress - eMail address of sender
    ; $s_ToAddress - Address that email is to be sent to
    ; $s_Username - Username for Authentication (bernd670)
    ; $s_Passwd - Password for Authentication (bernd670)
    ; $s_Subject - Subject of eMail
    ; $as_Body - Single dimension array containing the body of eMail as strings
    ; $s_helo - Helo identifier (default @COMPUTERNAME) sometime needed by smtp server
    ; $s_first - send before Helo identifier (default @CRLF) sometime needed by smtp server
    ; $b_trace - trace on a splash window (default 0 = no trace)
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns 1
    ; On Failure - 0 and sets
    ; @ERROR = 1 - Invalid Parameters
    ; @ERROR = 2 - Unable to start TCP
    ; @ERROR = 3 - Unable to resolve IP
    ; @ERROR = 4 - Unable to create socket
    ; @ERROR = 5x - Cannot open SMTP session
    ; @ERROR = 50x - Cannot send body
    ; @ERROR = 5000 - Cannot close SMTP session
    ; Authors: Original function to send email via TCP - Asimzameer
    ; Conversion to UDF - Walkabout
    ; Correction Helo, timeout, trace - Jpm
    ; Correction send before Helo - Jpm
    ; Include Authentication - bernd670
    ;
    ;===============================================================================
    Func _INetSmtpMailAuth($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Username, $s_Passwd, $s_Subject = "", $as_Body = "", $s_helo = "", $s_first="-1", $b_trace = 0)

    Local $v_Socket
    Local $s_IPAddress
    Local $i_Count
    Local $s_Send[9]
    Local $s_ReplyCode[9];Return code from SMTP server indicating success

    If $s_SmtpServer = "" Or $s_FromAddress = "" Or $s_ToAddress = "" Or $s_Username = "" Or $s_Passwd = "" Or $s_FromName = "" Or StringLen($s_FromName) > 256 Then
    SetError(1)
    Return 0
    EndIf
    If $s_helo = "" Then $s_helo = @ComputerName
    If TCPStartup() = 0 Then
    SetError(2)
    Return 0
    EndIf
    StringRegExp($s_SmtpServer, "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
    If @extended Then
    $s_IPAddress = $s_SmtpServer
    Else
    $s_IPAddress = TCPNameToIP($s_SmtpServer)
    EndIf
    If $s_IPAddress = "" Then
    TCPShutdown()
    SetError(3)
    Return 0
    EndIf
    $v_Socket = TCPConnect($s_IPAddress, 25)
    If $v_Socket = -1 Then
    TCPShutdown()
    SetError(4)
    Return (0)
    EndIf

    $s_Send[0] = "HELO " & $s_helo & @CRLF
    If StringLeft($s_helo,5) = "EHLO " Then $s_Send[0] = "EHLO " & $s_helo & @CRLF
    $s_ReplyCode[0] = "250"

    $s_Send[1] = "AUTH LOGIN" & @CRLF
    $s_ReplyCode[1] = "334"
    $s_Send[2] = _Base64Encoding($s_Username) & @CRLF
    $s_ReplyCode[2] = "334"
    $s_Send[3] = _Base64Encoding($s_Passwd) & @CRLF
    $s_ReplyCode[3] = "235"
    $s_Send[4] = "MAIL FROM: <" & $s_FromAddress & ">" & @CRLF
    $s_ReplyCode[4] = "250"
    $s_Send[5] = "RCPT TO: <" & $s_ToAddress & ">" & @CRLF
    $s_ReplyCode[5] = "250"
    $s_Send[6] = "DATA" & @CRLF
    $s_ReplyCode[6] = "354"

    $s_Send[7] = "From: " & $s_FromName & " <" & $s_FromAddress & ">" & @CRLF & _
    "To: " & "<" & $s_ToAddress & ">" & @CRLF & _
    "Subject: " & $s_Subject & @CRLF & _
    "Mime-Version: 1.0" & @CRLF & _
    "Content-Type: text/plain; charset=US-ASCII" & @CRLF & _
    @CRLF
    $s_ReplyCode[7] = ""

    $s_Send[8] = @CRLF & "." & @CRLF
    $s_ReplyCode[8] = "250"

    ; open stmp session
    If _SmtpSend($v_Socket, $s_Send[0], $s_ReplyCode[0], $b_trace, "220", $s_first) Then
    SetError(50)
    Return 0
    EndIf

    ; send header
    For $i_Count = 0 To UBound($s_Send) - 2
    If _SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then
    SetError(50 + $i_Count)
    Return 0
    EndIf
    Next

    ; send body records (a record can be multiline : take care of a subline beginning with a dot should be ..)
    For $i_Count = 0 To UBound($as_Body) - 1
    ; correct line beginning with a dot
    If StringLeft($as_Body[$i_Count], 1) = "." Then $as_Body[$i_Count] = "." & $as_Body[$i_Count]

    If _SmtpSend($v_Socket, $as_Body[$i_Count] & @CRLF, "", $b_trace) Then
    SetError(500 + $i_Count)
    Return 0
    EndIf
    Next

    ; close the smtp session
    $i_Count = UBound($s_Send) - 1
    If _SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then
    SetError(5000)
    Return 0
    EndIf

    TCPCloseSocket($v_Socket)
    TCPShutdown()
    Return 1
    EndFunc ;==>_INetSmtpMailAuth


    ;===============================================================================
    ;
    ; Function Name: _Base64Encoding()
    ; Description: Kodiert eine Zeichenfolge mit dem Base64-Verfahren
    ; (http://de.wikipedia.org/wiki/Base64)
    ; Parameter(s): $String - Zeichenfolge die kodiert werden soll
    ; Requirement(s): None
    ; Return Value(s): Kodierte Zeichenfolge
    ; Authors: bernd670
    ;
    ;===============================================================================
    Func _Base64Encoding ($String)

    $strUmsetzung = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    $strRetValue = ""

    For $i = 1 To StringLen($String) Step 3
    $strTok = StringMid($String,$i,3)
    Switch StringLen($strTok)
    Case 3
    $iTokVal = (Asc(StringMid($strTok,1,1)) * 256 + _
    Asc(StringMid($strTok,2,1))) * 256 + _
    Asc(StringMid($strTok,3,1))
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt

    Case 2
    $iTokVal = (Asc(StringMid($strTok,1,1)) * 256 + _
    Asc(StringMid($strTok,2,1))) * 256
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt & "="

    Case 1
    $iTokVal = Asc(StringMid($strTok,1,1)) * 65536
    $iTokVal = BitShift($iTokVal,12)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt & "=="

    EndSwitch
    Next

    Return $strRetValue
    EndFunc


    Global $path = "c:\temp" ; Hier den Pfad eintragen, der durchsucht werden soll
    Global $aFiles = _GetFilesFolder_Rekursiv($path, '*', 0), $Diff, $Hit
    Global $Timer = TimerInit()
    While 1
    If TimerDiff($Timer) > 3600000 Then ; 3.600.000 ms = 1 Stunde
    $Diff = ''
    $aFilesDiff = _GetFilesFolder_Rekursiv($path, '*', 0)
    For $i = 1 To $aFilesDiff[0]
    $Hit = True
    For $j = 1 To $aFiles[0]
    If $aFilesDiff[$i] = $aFiles[$j] Then
    $Hit = False
    ExitLoop
    EndIf
    Next
    If $Hit Then $Diff &= $aFilesDiff[$i] & @CRLF
    Next
    $hFile = FileOpen(@ScriptDir & '\NeueDateien.txt', 1)
    FileWrite($hFile, $Diff)
    FileClose($hFile)
    ;~ MsgBox(0, 'Neue Dateien', $Diff)
    $aFiles = ''
    $aFiles = $aFilesDiff
    $Timer = TimerInit()


    $s_SmtpServer = "smtp.gmx.de"
    $s_FromName = "Odette"
    $s_FromAddress = "deinemailadresse@gmx.de"
    $s_ToAddress = "Empfangsdresse@deinemail.de"
    $s_Subject = "Odette Daten !"
    $s_UName = "Dein GMX Name"
    $s_PWD = "Dein Passwort"
    Dim $as_Body[2]
    if $Diff = "" Then
    $as_Body[0] = "Es liegen keine neuen Dateien in Odette vor !"
    Else
    $as_Body[0] = "Es liegen folgende Neue Dateien in Odette vor :"
    Endif
    $as_Body[1] = $Diff
    $Response = _INetSmtpMailAuth ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_UName, $s_PWD, $s_Subject, $as_Body, "EHLO ")
    ;~ $Response = _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    $err = @error
    If $Response = 1 Then
    MsgBox(0, "Success!", "Mail sent")
    Else
    MsgBox(0, "Error!", "Mail failed with error code " & $err)
    EndIf


    EndIf
    Sleep(100)
    WEnd


    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard); 1 -@CR; 2 -@LF; oder beliebiges Zeichen
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix (bugfix@autoit.de)
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '0'
    $sDelim = @CRLF
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles,1), $sDelim)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles,1)
    EndIf
    EndFunc

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc



    Habe mal Msgbox drin gelassen für meine Tests.
    Jetzt habe ich nur noch ein Problem.
    Beim Starten des Scripts liest er mir das verzeichnis aus.
    Das ist nicht das Problem :)
    Folgendes Passiert jetzt, das Script schickt mir erstmal alle Dateien als Neue Dateien.
    Solange das Script Läuft schickt er mir Folgerichtig immer die richtigen neuen Dateien als Neue.
    Beende ich das Script schickt er mir wieder alle Dateien als Neue Dateien.
    Wie muss ich vorgehen das er mir auch dann nur die Neuen Dateien als Neue schickt ?
    Irgendwie sollte ich die beim ersten Scann eingetragenen Dateien mitloggen und dann jede stunde eine neue Datei schreiben in folgender form.

    DD.MM.YYYY_HH.MM.SS.txt

    Also z.B. 26.07.2008_01.51.15.txt

    Datum mit Uhrzeit also.
    Jetzt immer die neu Generierte Datei mit der aktuellsten vergleichen und dann die Differenz als $Diff versenden.
    Da man ja den rechner morgens neu startet, kann es durchaus sein das beim neustart des scriptes mal 8 Stunden vergehen.
    Kann mir da jemand einen Denkanstoss geben ?
    Habe es nicht so mit den String vergleichen usw.


    Vielen Dank im voraus für eure Hilfestellungen.


    mfg Observer

  • ich würde das Skript einmal ausführen ohne Mails und dann automatisch ausführen lassen

  • Hi Seven, jo wäre eine Möglichkeit.

    Nur was ist wenn in der zeit wo der rechner hochläuft schon dateien reinkamen ?
    Diese gehen mir dann verloren :(
    Manche der Dateien sind nur 2kb gross, die kommen ruckzuck rein.
    Habe jetzt auch das Umgesetzt mit der Uhrzeit der Datei.
    Speichert jetzt also soweit korrekt ab.


    Andere Frage :
    Wenn ich die Dateien scanne,kann ich da das erstellungsdatum der datei prüfen ?
    Würde heisen ich scanne jede stunde durch ob in der zeit von sagen wir mal 13:30 - 14:30 eine Datei erstellt wurde und diese dann als Info versenden ?

    mfg Observer

  • Ja, das geht :)

    Spoiler anzeigen
    Zitat

    Function FileGetTimeFileGetTime ( "filename" [, option [, format]] )


    Parameters

    • filename Filename to check.
    • option [optional] Flag to indicate which timestamp
      • 0 = Modified (default)
      • 1 = Created
      • 2 = Accessed
    • format [optional] to specify type of return
      • 0 = return an array (default)
      • 1 = return a string YYYYMMDDHHMMSS
  • Hab mal zusammen geschrieben. Du musst halt das noch an deine Wünsche anpassen

    Spoiler anzeigen
    [autoit]


    $time_start = "14.30"

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

    $time = FileGetTime(@ScriptDir & "\file.txt", 1, 0)
    If IsArray($time) Then
    If ($time[3] & "." & $time[4]) > $time_start Then
    MsgBox(0, "", '"' & @ScriptDir & '\file.txt" wurde nach 14.30 Uhr erstellt.')
    EndIf
    EndIf

    [/autoit]
  • Datum vergelichen kann man auch einfach mit:

    Spoiler anzeigen
    [autoit]

    $testdate = _CalcDate2FileDateString("2008/07/25 23:00:00")
    MsgBox(0, '', $testdate)
    $filedate = FileGetTime(@AutoItExe,1,1)
    $vergleich = StringCompare($filedate,$testdate,1)
    Select
    Case $vergleich > 0
    MsgBox(0, '', @AutoItExe & " wurde nach " & _FileDateString2Calc($testdate) & " erstellt")
    Case $vergleich < 0
    MsgBox(0, '', @AutoItExe & " wurde vor " & _FileDateString2Calc($testdate) & " erstellt")
    Case Else
    MsgBox(0, '', @AutoItExe & " wurde genau am " & _FileDateString2Calc($testdate) & " erstellt")
    EndSelect

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

    ; Author(s): Prog@ndy
    Func _FileDateString2Calc($filedate)
    Return StringRegExpReplace($filedate,"(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})","$1/$2/$3 $4:$5:$6")
    EndFunc
    ; Author(s): Prog@ndy
    Func _CalcDate2FileDateString($calcdate)
    Return StringRegExpReplace($calcdate,"(\d{4})/(\d{2})/(\d{2}) (\d{2}):(\d{2}):(\d{2})","$1$2$3$4$5$6")
    EndFunc

    [/autoit]
  • Hm, ok.
    Wie müsste ich das von mir (Bugfix und Oscars)

    Spoiler anzeigen
    [autoit]

    #include <INet.au3>

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

    ;===============================================================================
    ;
    ; Function Name: _INetSmtpMailAuth()
    ; Description: Sends an email using SMTP over TCP IP.
    ; Parameter(s): $s_SmtpServer - SMTP server to be used for sending email
    ; $s_FromName - Name of sender
    ; $s_FromAddress - eMail address of sender
    ; $s_ToAddress - Address that email is to be sent to
    ; $s_Username - Username for Authentication (bernd670)
    ; $s_Passwd - Password for Authentication (bernd670)
    ; $s_Subject - Subject of eMail
    ; $as_Body - Single dimension array containing the body of eMail as strings
    ; $s_helo - Helo identifier (default @COMPUTERNAME) sometime needed by smtp server
    ; $s_first - send before Helo identifier (default @CRLF) sometime needed by smtp server
    ; $b_trace - trace on a splash window (default 0 = no trace)
    ; Requirement(s): None
    ; Return Value(s): On Success - Returns 1
    ; On Failure - 0 and sets
    ; @ERROR = 1 - Invalid Parameters
    ; @ERROR = 2 - Unable to start TCP
    ; @ERROR = 3 - Unable to resolve IP
    ; @ERROR = 4 - Unable to create socket
    ; @ERROR = 5x - Cannot open SMTP session
    ; @ERROR = 50x - Cannot send body
    ; @ERROR = 5000 - Cannot close SMTP session
    ; Authors: Original function to send email via TCP - Asimzameer
    ; Conversion to UDF - Walkabout
    ; Correction Helo, timeout, trace - Jpm
    ; Correction send before Helo - Jpm
    ; Include Authentication - bernd670
    ;
    ;===============================================================================
    Func _INetSmtpMailAuth($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Username, $s_Passwd, $s_Subject = "", $as_Body = "", $s_helo = "", $s_first="-1", $b_trace = 0)

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

    Local $v_Socket
    Local $s_IPAddress
    Local $i_Count
    Local $s_Send[9]
    Local $s_ReplyCode[9];Return code from SMTP server indicating success

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

    If $s_SmtpServer = "" Or $s_FromAddress = "" Or $s_ToAddress = "" Or $s_Username = "" Or $s_Passwd = "" Or $s_FromName = "" Or StringLen($s_FromName) > 256 Then
    SetError(1)
    Return 0
    EndIf
    If $s_helo = "" Then $s_helo = @ComputerName
    If TCPStartup() = 0 Then
    SetError(2)
    Return 0
    EndIf
    StringRegExp($s_SmtpServer, "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")
    If @extended Then
    $s_IPAddress = $s_SmtpServer
    Else
    $s_IPAddress = TCPNameToIP($s_SmtpServer)
    EndIf
    If $s_IPAddress = "" Then
    TCPShutdown()
    SetError(3)
    Return 0
    EndIf
    $v_Socket = TCPConnect($s_IPAddress, 25)
    If $v_Socket = -1 Then
    TCPShutdown()
    SetError(4)
    Return (0)
    EndIf

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

    $s_Send[0] = "HELO " & $s_helo & @CRLF
    If StringLeft($s_helo,5) = "EHLO " Then $s_Send[0] = "EHLO " & $s_helo & @CRLF
    $s_ReplyCode[0] = "250"

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

    $s_Send[1] = "AUTH LOGIN" & @CRLF
    $s_ReplyCode[1] = "334"
    $s_Send[2] = _Base64Encoding($s_Username) & @CRLF
    $s_ReplyCode[2] = "334"
    $s_Send[3] = _Base64Encoding($s_Passwd) & @CRLF
    $s_ReplyCode[3] = "235"
    $s_Send[4] = "MAIL FROM: <" & $s_FromAddress & ">" & @CRLF
    $s_ReplyCode[4] = "250"
    $s_Send[5] = "RCPT TO: <" & $s_ToAddress & ">" & @CRLF
    $s_ReplyCode[5] = "250"
    $s_Send[6] = "DATA" & @CRLF
    $s_ReplyCode[6] = "354"

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

    $s_Send[7] = "From: " & $s_FromName & " <" & $s_FromAddress & ">" & @CRLF & _
    "To: " & "<" & $s_ToAddress & ">" & @CRLF & _
    "Subject: " & $s_Subject & @CRLF & _
    "Mime-Version: 1.0" & @CRLF & _
    "Content-Type: text/plain; charset=US-ASCII" & @CRLF & _
    @CRLF
    $s_ReplyCode[7] = ""

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

    $s_Send[8] = @CRLF & "." & @CRLF
    $s_ReplyCode[8] = "250"

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

    ; open stmp session
    If _SmtpSend($v_Socket, $s_Send[0], $s_ReplyCode[0], $b_trace, "220", $s_first) Then
    SetError(50)
    Return 0
    EndIf

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

    ; send header
    For $i_Count = 0 To UBound($s_Send) - 2
    If _SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then
    SetError(50 + $i_Count)
    Return 0
    EndIf
    Next

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

    ; send body records (a record can be multiline : take care of a subline beginning with a dot should be ..)
    For $i_Count = 0 To UBound($as_Body) - 1
    ; correct line beginning with a dot
    If StringLeft($as_Body[$i_Count], 1) = "." Then $as_Body[$i_Count] = "." & $as_Body[$i_Count]

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

    If _SmtpSend($v_Socket, $as_Body[$i_Count] & @CRLF, "", $b_trace) Then
    SetError(500 + $i_Count)
    Return 0
    EndIf
    Next

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

    ; close the smtp session
    $i_Count = UBound($s_Send) - 1
    If _SmtpSend($v_Socket, $s_Send[$i_Count], $s_ReplyCode[$i_Count], $b_trace) Then
    SetError(5000)
    Return 0
    EndIf

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

    TCPCloseSocket($v_Socket)
    TCPShutdown()
    Return 1
    EndFunc ;==>_INetSmtpMailAuth

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

    ;===============================================================================
    ;
    ; Function Name: _Base64Encoding()
    ; Description: Kodiert eine Zeichenfolge mit dem Base64-Verfahren
    ; (http://de.wikipedia.org/wiki/Base64)
    ; Parameter(s): $String - Zeichenfolge die kodiert werden soll
    ; Requirement(s): None
    ; Return Value(s): Kodierte Zeichenfolge
    ; Authors: bernd670
    ;
    ;===============================================================================
    Func _Base64Encoding ($String)

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

    $strUmsetzung = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    $strRetValue = ""

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

    For $i = 1 To StringLen($String) Step 3
    $strTok = StringMid($String,$i,3)
    Switch StringLen($strTok)
    Case 3
    $iTokVal = (Asc(StringMid($strTok,1,1)) * 256 + _
    Asc(StringMid($strTok,2,1))) * 256 + _
    Asc(StringMid($strTok,3,1))
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt

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

    Case 2
    $iTokVal = (Asc(StringMid($strTok,1,1)) * 256 + _
    Asc(StringMid($strTok,2,1))) * 256
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt & "="

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

    Case 1
    $iTokVal = Asc(StringMid($strTok,1,1)) * 65536
    $iTokVal = BitShift($iTokVal,12)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1)
    $iTokVal = BitShift($iTokVal,6)
    $strTokCryt = StringMid($strUmsetzung,(BitAND($iTokVal,63)) + 1,1) & $strTokCryt
    $strRetValue &= $strTokCryt & "=="

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

    EndSwitch
    Next

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

    Return $strRetValue
    EndFunc

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

    Global $path = "c:\temp" ; Hier den Pfad eintragen, der durchsucht werden soll
    Global $aFiles = _GetFilesFolder_Rekursiv($path, '*', 0), $Diff, $Hit
    Global $Timer = TimerInit()
    While 1
    If TimerDiff($Timer) > 3600000 Then ; 3.600.000 ms = 1 Stunde
    $Diff = ''
    $aFilesDiff = _GetFilesFolder_Rekursiv($path, '*', 0)
    For $i = 1 To $aFilesDiff[0]
    $Hit = True
    For $j = 1 To $aFiles[0]
    If $aFilesDiff[$i] = $aFiles[$j] Then
    $Hit = False
    ExitLoop
    EndIf
    Next
    If $Hit Then $Diff &= $aFilesDiff[$i] & @CRLF
    Next
    $hFile = FileOpen(@ScriptDir & '\NeueDateien.txt', 1)
    FileWrite($hFile, $Diff)
    FileClose($hFile)
    ;~ MsgBox(0, 'Neue Dateien', $Diff)
    $aFiles = ''
    $aFiles = $aFilesDiff
    $Timer = TimerInit()

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

    $s_SmtpServer = "smtp.gmx.de"
    $s_FromName = "Odette"
    $s_FromAddress = "deinemailadresse@gmx.de"
    $s_ToAddress = "Empfangsdresse@deinemail.de"
    $s_Subject = "Odette Daten !"
    $s_UName = "Dein GMX Name"
    $s_PWD = "Dein Passwort"
    Dim $as_Body[2]
    if $Diff = "" Then
    $as_Body[0] = "Es liegen keine neuen Dateien in Odette vor !"
    Else
    $as_Body[0] = "Es liegen folgende Neue Dateien in Odette vor :"
    Endif
    $as_Body[1] = $Diff
    $Response = _INetSmtpMailAuth ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_UName, $s_PWD, $s_Subject, $as_Body, "EHLO ")
    ;~ $Response = _INetSmtpMail ($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject, $as_Body)
    $err = @error
    If $Response = 1 Then
    MsgBox(0, "Success!", "Mail sent")
    Else
    MsgBox(0, "Error!", "Mail failed with error code " & $err)
    EndIf

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

    EndIf
    Sleep(100)
    WEnd

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard); 1 -@CR; 2 -@LF; oder beliebiges Zeichen
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '0'
    $sDelim = @CRLF
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles,1), $sDelim)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles,1)
    EndIf
    EndFunc

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

    Func _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF[/url])
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc

    [/autoit]

    Jetzt mit dem von dir zusammenpacken ?
    Es sollte also folgendermasen ablaufen.
    Das Script sollte beim Lauf eine Datei Last_scan.txt erzeugen.
    Diese datei sollte beim nächsten lauf geprüft werden.
    Jetzt sollte das Script alle dateien scannen und die dateien die zwischen dem Last_scan.txt und dem jetzigen lauf erzeugt wurden als info in eine Datei abspeichern.
    Diese Info dann auch gleich noch als Mail an angegebenen User versenden.
    Dazu wird es wohl nach jedem Lauf die Datei Last_scan.txt löschen müssen und neu erstellen.
    Somit hätte man immer eine Logdatei und die Last_scan.txt als Kontrolldatei.

    Wie schwer wäre sowas machbar ?
    Könnte mir da jemand bei helfen ?

    Vielen dank im voraus.

    mfg Observer


    Edit BugFix: Bitte AutoIt-Tags verwenden ( [ autoit ] code [ /autoit ] )

    Einmal editiert, zuletzt von BugFix (26. Juli 2008 um 14:55)

  • Für was brauchst du denn das Datum. Es geht doch auch ohne :)

    Spoiler anzeigen
    [autoit]

    ;~ Global $aFiles = _GetFilesFolder_Rekursiv($path, '*', 0), $Diff, $Hit
    Global $aFiles[1], , $Diff, $Hit
    _FileReadToArray(@ScriptDir & "\last_scan.txt",$aFiles)
    If @error Then $aFiles = _GetFilesFolder_Rekursiv($path, '*', 0)
    ...
    $aFiles = $aFilesDiff
    FileDelete(@ScriptDir & "\last_scan.txt")
    _FileWriteFromArray(@ScriptDir & "\last_scan.txt",$aFiles,1)

    [/autoit]
  • er will die geänderten dateien auflisten, also auch die wo zwischen einer bestimmten zeit geändert wurden