2010-12-29 08:06:29 +0000 2010-12-29 08:06:29 +0000
87
87

Wie überwacht man einen Ordner und löst eine Befehlszeilenaktion aus, wenn eine Datei erstellt oder bearbeitet wird?

Ich muss auf meinem Vista-Rechner eine Art Skript einrichten, so dass jedes Mal, wenn eine Datei zu einem bestimmten Ordner hinzugefügt wird, automatisch ein Hintergrundprozess ausgelöst wird, der die Datei bearbeitet. (Der Hintergrundprozess ist nur ein Befehlszeilen-Dienstprogramm, das den Dateinamen als Argument nimmt, zusammen mit einigen anderen vordefinierten Optionen)

Ich möchte dies aus Leistungs- und Wartungsgründen, wenn möglich, unter Verwendung nativer Windows-Funktionen tun. Ich habe mir die Verwendung des Taskplaners angesehen, aber nachdem ich das Auslösesystem eine Weile durchgesehen habe, konnte ich nicht viel Sinn darin erkennen, und ich bin mir nicht einmal sicher, ob es in der Lage ist, das zu tun, was ich brauche.

Ich wäre für jeden Vorschlag dankbar. Danke!

Antworten (8)

96
96
96
2014-11-23 18:26:49 +0000

Bei der Arbeit verwenden wir Powershell zur Überwachung von Ordnern. Es kann seit Windows Vista (.NET und PowerShell ist vorinstalliert) ohne zusätzliche Tools verwendet werden.

Dieses Skript überwacht einen bestimmten Ordner und schreibt eine Protokolldatei. Sie können die Aktion ersetzen und tun, was immer Sie wollen, z.B. ein externes Tool aufrufen

Beispielprotokolldatei

11/23/2014 19:22:04, Created, D:\source\New Text Document.txt 11/23/2014 19:22:09, Changed, D:\source\New Text Document.txt 11/23/2014 19:22:09, Changed, D:\source\New Text Document.txt 11/23/2014 19:22:14, Deleted, D:\source\New Text Document.txt

StartMonitoring.ps1

### SET FOLDER TO WATCH + FILES TO WATCH + SUBFOLDERS YES/NO
    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "D:\source"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

### DEFINE ACTIONS AFTER AN EVENT IS DETECTED
    $action = { $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "D:\log.txt" -value $logline
              }    
### DECIDE WHICH EVENTS SHOULD BE WATCHED 
    Register-ObjectEvent $watcher "Created" -Action $action
    Register-ObjectEvent $watcher "Changed" -Action $action
    Register-ObjectEvent $watcher "Deleted" -Action $action
    Register-ObjectEvent $watcher "Renamed" -Action $action
    while ($true) {sleep 5}

Verwendung von

  1. Erstellen Sie eine neue Textdatei
  2. Kopieren und fügen Sie den obigen Code ein 3. Ändern Sie die folgenden Einstellungen nach Ihren eigenen Bedürfnissen:
  3. zu überwachender Ordner: $watcher.Path = "D:\source"
  4. Dateifilter, um nur bestimmte Dateitypen einzuschließen: $watcher.Filter = "*.*"
  5. Unterverzeichnisse einbeziehen ja/nein: $watcher.IncludeSubdirectories = $true
  6. Speichern und umbenennen in StartMonitoring.ps1
  7. Starten Sie die Überwachung durch Rechtsklick “ Ausführen mit PowerShell

Um die Überwachung zu beenden, genügt es, Ihr PowerShell-Fenster zu schließen

Lesen Sie weiter

6
6
6
2010-12-29 08:49:30 +0000

Sie scheinen auf der richtigen Spur zu sein - Sie könnten den Taskplaner verwenden, um eine .bat oder . cmd-Datei regelmäßig ausführen, und diese Datei könnte mit einer Zeile beginnen, um zu prüfen, ob die erforderliche Datei vorhanden ist - tatsächlich würde ich prüfen, ob die Datei nicht vorhanden ist; zum Beispiel:

@ECHO OFF
REM Example file
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS EXIT 1
REM All this gets done if the file exists...
:
:
EXIT 0

Sie könnten diesen Code auch modifizieren und ihn in einer Schleife mit einer, sagen wir, 1 Minute Verzögerung in der Schleife laufen lassen und dann einen Verweis auf die Batch-Datei im Windows-Startordner setzen:

@ECHO OFF
REM Example file
:LOOP    
IF NOT EXIST C:\SOMEWHERE\SUBFOLDER\THISFILE.THS GOTO SKIP01
REM All this gets done if the file exists...
:
:
:SKIP01
REM Crafty 1 minute delay...
PING 1.1.1.1 -n 10 -w 6000 >NUL
GOTO LOOP

Es gibt noch andere Möglichkeiten, eine Verzögerung zu erreichen, je nachdem, welche Windows-Version läuft und welche zusätzlichen Resource-Kits installiert wurden, aber der PING-Befehl funktioniert so ziemlich unter allen Umständen. Im obigen PING-Befehl werden 10 Phantom-PINGS mit einer Verzögerung von 6000ms (d.h.: 6 Sekunden) zwischen ihnen ausgeführt. Sie können mit diesen Werten spielen, um die erforderliche Verzögerung zwischen Batch-Datei-Schleifen zu erreichen.

4
4
4
2011-01-07 04:01:48 +0000

Danke an alle für die Vorschläge.

Am Ende schrieb ich ein VBScript, das grob auf der Idee von Linker3000 basierte, den Ordner abzufragen und den Taskplaner zu verwenden, um ihn beim Start laufen zu lassen. Die grundlegende Syntax erhielt ich schließlich von this resource und nahm die erforderlichen Anpassungen vor.

Ich würde das Skript gerne irgendwann noch optimieren, indem ich den Kern des Skripts auf einem ereignisgesteuerten System laufen lassen würde, aber ich habe keine Zeit mehr, daran zu arbeiten, und, na ja, das ist gut genug.

Hier ist das Skript, falls es jemanden interessiert (wobei das irrelevante Konvertierungssegment der Übersichtlichkeit halber geschwärzt wurde):

' FOLDER TO MONITOR
strFolder = "J:\monitored-folder"

' FREQUENCY TO CHECK IT, IN SECONDS
nFrequency = 10

strComputer = "."
strQueryFolder = Replace(strFolder, "\", "\\")
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\" & strComputer & "\root\cimv2") 
Set colMonitoredEvents = objWMIService.ExecNotificationQuery ("SELECT * FROM __InstanceCreationEvent WITHIN " & nFrequency & " WHERE Targetinstance ISA 'CIM_DirectoryContainsFile' and TargetInstance.GroupComponent='Win32_Directory.Name=""" & strQueryFolder & """'") 

Do 
    Set objLatestEvent = colMonitoredEvents.NextEvent
    strNewFile = objLatestEvent.TargetInstance.PartComponent
    arrNewFile = Split(strNewFile, "=")
    strFilePath = arrNewFile(1)
    strFilePath = Replace(strFilePath, "\", "\")
    strFilePath = Replace(strFilePath, Chr(34), "")
    strFileName = Replace(strFilePath, strFolder, "")
    strTempFilePath = WScript.CreateObject("Scripting.FileSystemObject").GetSpecialFolder(2) & "\TEMP.M4A"

    ' DO THE OPERATION STUFF
    ' ...
Loop

(Außerdem möchte ich diese Frage nicht offiziell unbeantwortet lassen - und ich hasse es, meine eigene Antwort auf die Frage zu akzeptieren - aber ich habe die Antwort von Linker3000 zum Dank überstimmt!)

3
3
3
2016-11-30 09:15:20 +0000

Wenn die Aktion nur darin besteht, geänderte Dateien zu kopieren, können Sie robocopy /MON

verwenden. Ich weiß nicht, ob robocopy FileSystemWatcher verwendet oder durch Abfragen nach Änderungen arbeitet.

2
2
2
2011-03-12 13:01:15 +0000

Oder Sie könnten Watch 4 Folder verwenden. Anscheinend ist es Freeware, portabel und mit Windows 7 kompatibel. Ich habe es nicht ausprobiert, aber durch eine Websuche gefunden und dachte, ich gebe es weiter.

Mir gefällt auch das VBS-Skript, das ebenfalls auf der Seite zu finden ist.

2
2
2
2016-05-16 17:14:11 +0000

Sie können sich DropIt (kostenlos) ansehen. Das Programm eignet sich zur automatisierten Verarbeitung eingehender Dateien. Sie können es verschieben, kopieren, löschen und Parameter an andere Kommandozeilenprogramme übergeben, um Bilder zu konvertieren, PDFs aufzuteilen usw.

2
2
2
2017-12-20 02:16:44 +0000

Ich habe auch watchman gefunden, das ziemlich groß zu sein scheint, und ein kleineres watchexec habe ich noch nicht ausprobiert.

Watchman fühlt sich nett und programmatisch an. Ein CLI-Dienstprogramm für Power-User.

1
1
1
2016-04-14 08:34:08 +0000

Wir benutzen das kommerzielle (d.h. nicht kostenlose) Tool Folder Poll von http://www.myassays.com/folder-poll , um genau dies zu tun. Es handelt sich dabei um eine Windows-Anwendung, die eine benutzerfreundliche Manager-Anwendung enthält, um eine einfache Konfiguration zu ermöglichen. Außerdem gibt es eine XML-Konfigurationsoption. Die eigentliche Ordnerabfrage läuft als Windows-Dienst (startet also automatisch bei jedem Neustart). Wenn eine neue Datei in einem abgefragten Ordner entdeckt wird, kann eine Anwendung automatisch gestartet werden (Sie können Ihre eigenen benutzerdefinierten Befehlszeilenargumente angeben). Sie kann auch andere Dinge wie das Kopieren/Verschieben von Dateien tun. Außerdem kann die Aktivität in einer Protokolldatei protokolliert werden, und es gibt andere erweiterte Operationen.