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

Ich muss auf meinem Vista-Computer eine Art Skript einrichten, damit beim Hinzufügen einer Datei zu einem bestimmten Ordner automatisch ein Hintergrundprozess ausgelöst wird, der mit der Datei ausgeführt wird. (Der Hintergrundprozess ist nur ein Befehlszeilenprogramm, das den Dateinamen zusammen mit einigen anderen vordefinierten Optionen als Argument verwendet.)

Ich möchte dies aus Leistungs-und Wartungsgründen mit nativen Windows-Funktionen tun. Ich habe nachgesehen mit Taskplaner, aber nachdem ich das Trigger-System eine Weile durchgesehen habe, konnte ich nicht viel Sinn machen, und ich bin mir nicht einmal sicher, ob es in der Lage ist, das zu tun, was ich brauche.

Ich würde mich über Vorschläge freuen. Danke!

Author: bigmattyh, 2010-12-29

8 answers

Bei der Arbeit verwenden wir Powershell, um Ordner zu überwachen.
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 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}

Wie benutzt man

  1. Erstellen Sie eine neue Textdatei
  2. Copy & paste der oben genannten code
  3. Ändern Sie die folgenden Einstellungen nach Ihren eigenen Bedürfnissen:
    • zu überwachende Ordner: $watcher.Path = "D:\source"
    • Dateifilter, um nur bestimmte Dateitypen einzuschließen: $watcher.Filter = "*.*"
    • Unterverzeichnisse enthalten ja/Nein: $watcher.IncludeSubdirectories = $true
  4. Speichern und umbenennen in StartMonitoring.ps1
  5. Starten Sie die Überwachung mit Rechtsklick auf " Mit PowerShell ausführen

Um die Überwachung zu beenden, reicht es aus, das PowerShell-Fenster zu schließen

Weiter Lesen

 109
Author: nixda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-11-25 03:58:15

Sie scheinen in den richtigen Zeilen zu sein - Sie könnten den Taskplaner verwenden, um a auszuführen .fledermaus oder .cmd-Datei regelmäßig und diese Datei könnte mit einer Zeile beginnen, um die Existenz der erforderlichen Datei zu überprüfen-tatsächlich würde ich nach der Nichtexistenz der Datei suchen; 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önnen diesen Code auch ändern und in einer Schleife mit einer Verzögerung von beispielsweise 1 Minute in der Schleife ausführen und dann einen Verweis auf die Batchdatei in den Windows-Startordner einfügen:

@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 andere Möglichkeiten, eine Verzögerung entsprechend der Version von Windows zu erreichen, die ausgeführt wird und welche zusätzlichen Ressourcenkits installiert wurden, aber der PING-Befehl funktioniert unter allen Umständen. Im obigen PING-Befehl werden 10 Phantom-PINGS mit einer Verzögerung von 6000ms (dh: 6 Sekunden) zwischen ihnen ausgeführt, Sie können mit diesen Werten spielen, um die Verzögerung zu erreichen, die Sie zwischen Batch-Dateischleifen benötigen.

 6
Author: Linker3000,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-12-29 09:02:17

Vielen Dank an alle für die Vorschläge.

Am Ende habe ich ein VBScript geschrieben, das ungefähr auf der Idee von Linker3000 basiert, den Ordner abzufragen und den Taskplaner zu verwenden, damit er beim Start ausgeführt wird. Am Ende habe ich die grundlegende Syntax von this resource und die erforderlichen Optimierungen vorgenommen.

Ich möchte es immer noch irgendwann optimieren, da der Mut des Skripts auf einem ereignisgesteuerten System ausgeführt wird, aber mir ist die Zeit ausgegangen, daran zu arbeiten, und das ist gut genug.

Hier ist das Skript, falls jemand interessiert ist (wobei das irrelevante Konvertierungssegment aus Gründen der Klarheit überarbeitet 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 Linker3000 ' s Antwort als Dankeschön upvote!)

 6
Author: bigmattyh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-04-04 01:48:18

Sie könnten sich DropIt (kostenlos) ansehen. Das Programm eignet sich für die Verarbeitung eingehender Dateien auf automatisierte Weise. Sie können Parameter verschieben, kopieren, löschen und an andere Befehlszeilenprogramme übergeben, um Bilder zu konvertieren, PDFs aufzuteilen usw.

 3
Author: Sun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-05-16 17:14:11

Wenn die Aktion nur zum Kopieren geänderter Dateien dient, können Sie robocopy / MON

Weiß nicht, ob robocopy verwendet FileSystemWatcher oder Werke von polling-Verfahren für änderungen von

 3
Author: weberjn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-11-30 09:15:20

Auch gefunden watchman das scheint ziemlich groß zu sein, und ein kleineres watchexec Ich habe es nicht versucht.

Watchman fühlt sich nett und programmatisch. Ein CLI-Dienstprogramm für power-user.

 3
Author: Pysis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-08 15:58:09

Oder Sie könnten Watch 4 Folder. Anscheinend ist es Freeware, tragbar und kompatibel mit Windows 7. Ich habe es nicht versucht, aber fand es durch eine Web-Suche und dachte, ich würde es weitergeben.

Ich mag auch das VBS-Skript, das auch auf der Website vorgestellt wird.

 1
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-11-27 13:05:36

Wir verwenden das kommerzielle Tool (dh nicht kostenlos) Ordnerumfrage von http://www.myassays.com/folder-poll um genau das zu tun. Es ist 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 wird als Windows-Dienst ausgeführt (startet also bei jedem Neustart automatisch). Wenn eine neue Datei in einem abgefragten Ordner erkannt wird, kann eine Anwendung automatisch gestartet werden (Sie können Ihre eigene angeben benutzerdefinierte Befehlszeilenargumente). Es kann auch andere Dinge wie Kopieren/Verschieben von Dateien tun. Außerdem können Aktivitäten in einer Protokolldatei protokolliert werden und es gibt andere erweiterte Vorgänge.

 0
Author: Mister Cook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-04-14 08:34:08