Verzeichniss überwachen - files wegkopieren

  • Hallo zusammen

    Ich würde gerne mein %temp% überwachen, und alle files die da erscheinen im inkl Unterverzeichnisse ins c:\temp kopieren.

    Mein %tempt% liegt unter Windows7 hier: c:\Users\USERNAME\AppData\Local\Temp\

    Hintergrund ist der, dass Installationen des öfteren middleware installieren, die sie vorher im Tempverzeichniss abgelegt haben, wie Beispielsweise die VCredist Installationen.

    Bis anhin muss ich immer schnell genug sein, um diese während der Installation angreifen zu können. Gleichzeitig müssten die nicht kopierbaren Files (geöffnete temporäre Dateien übersprungen werden. Da der Script auch begreifen müsste, dass nur noch nicht kopierte Dateien kopiert werden müssten - übersteigt dass mein Scripting know how erheblich.

    Aber vielleicht hat jemand dazu schonmal was geschrieben, oder kann die entsprechenden Zeilen aus dem ärmel schütteln. Mir fällt aus dem stehgreif nur ein Griff zu robocopy ein, das komandozeilen tool würde das gewünschte bieten...

    Danke euch, Surfy

  • Hm,

    wieso veränderst du nicht einfach die Variable das alle Tempfiles automatisch dort laden?

    Findest du unter Start -> Rechtklick Computer -> Eigenschaften -> Erweiterte Systemeinstellungen -> Variablen

    Ich weiss nicht genau wofür du die Dateien auf dem Temp-Verzeichnis brauchst. Aber in der Regel ist es meistens so, das sobald du die Installation (bsp. Setup.exe) startest sind die gewünschten Files (evtl. *.msi) schon im Temp-Verzeichnis.

  • Die Setup löschen die daten meist nach dem Setup. Auf einem schnellen PC mit SSD hat man da oft kaum mehr die Zeit die Daten wegzukopieren, bevor die Installation zu ende ist.

    Daher würde auch das verbiegen des Tempverzeichnisses nichts ändern können.

    Daher ja auch meine Idee mit einen Script.

    Surfy

  • Du brauchst ja das Setup nicht komplett durchlaufen. Es reicht wenn die erste Seite kommt. Da befindet sich z.b. die MSI schon im Temp. Andernfalls könntest du anhand des Fensters ein copy starten.

    [autoit]


    $sFenster = Installation
    While WinActive($sFenster) = 1
    ...
    WEnd

    [/autoit]
  • Je nach Installation stimmt das. Aber es gibt mehrere Installationen die die runtimes nur während der Installation da ablegen - und nicht während den Dialog-Fenstern.

    Das ist besonders bei verschachtelten MSI Installationen zu beobachten.

    Da hilft nur "schnell sein" ;)

    Surfy

  • Entweder du gehst das TempDir andauernd durch und schaust ob sich was verändert hat oder du fängst die FileSystem-Events ab.
    Mal ein Grundgerüst, welches dir alle neu erstellten Dateien in %Temp% in die Scite-Console ausgibt:

    Auf neue Dateien in %Temp% reagieren
    [autoit]

    #include <WinAPI.au3>

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

    Global Const $s_Path = FileGetLongName(@TempDir) ; hier den zu prüfenden Pfad eintragen
    If Not FileExists($s_Path) Then Exit MsgBox(48, "Fehler", "Pfad " & $s_Path & " existiert nicht!")

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

    Opt("TrayMenuMode", 1)
    Opt("TrayOnEventMode", 1)

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

    Global Const $SHCNE_RENAMEITEM = 0x0001 ; Änderung von Dateinamen
    Global Const $SHCNE_CREATE = 0x0002 ; Erstellung von Dateien
    Global Const $SHCNE_DELETE = 0x0004 ; Löschen von Dateien
    Global Const $SHCNE_MKDIR = 0x0008 ; Erstellung von Ordnern
    Global Const $SHCNE_RMDIR = 0x0010 ; Löschen von Ordnern
    Global Const $SHCNE_UPDATEDIR = 0x1000 ; Änderungen in einem Pfad
    Global Const $SHCNE_UPDATEITEM = 0x2000 ; Änderungen in einer Datei
    Global Const $SHCNE_UPDATEIMAGE = 0x8000
    Global Const $SHCNE_RENAMEFOLDER = 0x20000
    Global Const $SHCNE_ALLEVENTS = 0x7FFFFFFF ; weitere siehe http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx

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

    Global $h_Shell32DLL = DllOpen("shell32.dll")

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

    ; Registriert ein FileSystemEvent mit einer AutoIt-Callback-Funktion
    Global $SHRegister = RegisterFSEvent($s_Path, $SHCNE_CREATE, EvaluateEvents, False)

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

    ; Erstelle ein Tray-Menü fürs Beenden
    OnAutoItExitRegister("Raus")
    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "Beenden")

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

    ; Endlosschleife damit AutoIt die meiste Zeit über pausiert ist (Beenden über das Tray-Icon möglich)
    Do
    Sleep(100)
    Until 0

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

    ; Funktion die aufgerufen wird wenn ein Event auftritt:
    Func EvaluateEvents(Const $hWndGUI, Const $MsgID, Const $wParam, Const $lParam)
    Local $h_pidl = DllStructCreate("PTR; PTR", $wParam)
    Local $s_Path = DllCall($h_Shell32DLL, "BOOLEAN", "SHGetPathFromIDListW", "ptr", DllStructGetData($h_pidl, 1), "wstr", "")[2]

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

    Switch $lParam ; Welche Art von Event ist aufgetreten?
    Case $SHCNE_CREATE ; Wenn ein Element nur vom Inhalt her geändert wurde
    ConsoleWrite($s_Path & @CRLF)
    EndSwitch
    ; EndIf
    EndFunc ;==>CheckOfNewFiles

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

    ; registriert ein FileSystemEvent eines Pfades mit einer Funktion
    Func RegisterFSEvent(Const $s_Path, Const $d_Events, Const $cb_CallBackFunc, Const $bRecursive = True)
    Local $h_GUI = GUICreate("")
    Local $h_MyWinMsg = _WinAPI_RegisterWindowMessage("irgendwas")
    GUIRegisterMsg($h_MyWinMsg, $cb_CallBackFunc)

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

    Local $h_PIDLIST = DllCall($h_Shell32DLL, "PTR", "ILCreateFromPathW", "WSTR", $s_Path)
    Local $strct_SHChangeNotifyEntry = DllStructCreate("PTR pidl; BOOLEAN fRecursive")
    $strct_SHChangeNotifyEntry.pidl = $h_PIDLIST[0]
    $strct_SHChangeNotifyEntry.fRecursive = $bRecursive

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

    Local $SHRegister = DllCall($h_Shell32DLL, "int", "SHChangeNotifyRegister", _
    "HWND", $h_GUI, _
    "INT", 0x0003, _
    "LONG", $d_Events, _
    "UINT", $h_MyWinMsg, _
    "INT", 1, _
    "struct*", $strct_SHChangeNotifyEntry)
    DllCall("ole32.dll", "none", "CoTaskMemFree", "ptr", $h_PIDLIST[0])
    Return $SHRegister
    EndFunc ;==>RegisterFSEvent

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

    Func Beenden()
    Exit
    EndFunc ;==>Beenden

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

    Func Raus()
    DllCall($h_Shell32DLL, "BOOLEAN", "SHChangeNotifyDeregister", "ULONG", $SHRegister[0])
    DllClose($h_Shell32DLL)
    EndFunc ;==>Raus

    [/autoit]