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

Hoe kan ik een map monitoren en een opdrachtregelactie activeren wanneer een bestand wordt gemaakt of bewerkt?

Ik moet een soort script instellen op mijn Vista machine, zodat wanneer een bestand wordt toegevoegd aan een bepaalde map, het automatisch een achtergrondproces activeert dat werkt op het bestand. (Het achtergrondproces is slechts een command-line hulpprogramma dat de bestandsnaam als argument neemt, samen met enkele andere voorgedefinieerde opties.)

Ik wil dit graag doen met behulp van native Windows functies, indien mogelijk, voor de prestaties en het onderhoud. Ik heb gekeken naar het gebruik van Task Scheduler, maar na een tijdje het triggersysteem te hebben doorgenomen, heb ik er niet veel zin in gehad, en ik weet niet eens zeker of het in staat is om te doen wat ik nodig heb.

Ik zou elke suggestie op prijs stellen. Bedankt.

Antwoorden (8)

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

Op het werk gebruiken we Powershell om mappen te monitoren. Het kan gebruikt worden sinds Windows Vista (.NET en PowerShell is voorgeïnstalleerd) zonder extra tools.

Dit script monitort een bepaalde map en schrijft een logbestand. Je kunt de actie vervangen en doen wat je wilt, bijvoorbeeld een externe tool

oproepen #### Voorbeeld logbestand

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}

Hoe gebruik je

  1. 1. Maak een nieuw tekstbestand
  2. 2. Kopieer & plak de bovenstaande code
  3. 4. Wijzig de volgende instellingen naar eigen behoefte:
  4. map om te monitoren: $watcher.Path = "D:\source"
  5. bestandsfilter om alleen bepaalde bestandstypes op te nemen: $watcher.Filter = "*.*"
  6. submappen opnemen ja/nee: $watcher.IncludeSubdirectories = $true
  7. Opslaan en hernoemen naar StartMonitoring.ps1
  8. Start monitoring door Rechts te klikken op “ Uitvoeren met PowerShell

Om de monitoring te stoppen, is het voldoende om uw PowerShell venster

verder te lezen

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

Je lijkt op de juiste lijnen te zitten - je zou de taakplanner kunnen gebruiken om een .bat of . cmd bestand op regelmatige basis en dat bestand zou kunnen beginnen met een regel om het bestaan van het vereiste bestand te controleren - in feite zou ik controleren op het niet bestaan van het bestand; bijvoorbeeld:

@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

Je zou deze code ook kunnen wijzigen en het in een lus kunnen laten draaien met een, zeg maar, 1 minuut vertraging in de lus en dan een verwijzing naar het batch-bestand in de Windows opstartmap plaatsen:

@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

Er zijn andere manieren om een vertraging te bereiken volgens de versie van Windows die draait en welke extra resource kits zijn geïnstalleerd, maar het PING-commando werkt onder alle omstandigheden vrij goed. In het bovenstaande PING commando worden 10 phantom PINGS uitgevoerd met een vertraging van 6000ms (d.w.z.: 6 seconden) ertussen, je kunt met deze waarden spelen om de vertraging te bereiken die je nodig hebt tussen de batch-bestandslussen.

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

Bedankt allemaal, voor de suggesties.

Uiteindelijk heb ik een VBS-script geschreven dat grofweg gebaseerd was op Linker3000’s idee om de map te peilen, en de Task Scheduler te gebruiken om het te laten draaien bij het opstarten. Uiteindelijk kreeg ik de basissyntax van deze bron en maakte ik de nodige aanpassingen.

Ik zou het nog steeds willen optimaliseren op een bepaald punt, met het lef van het script te draaien op een event-gedreven systeem, maar ik heb geen tijd meer om er aan te werken, en, nou ja, dit is goed genoeg.

Hier is het script, voor het geval dat iemand geïnteresseerd is (met het irrelevante conversiesegment dat voor de duidelijkheid is bewerkt):

' 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

(Ik wil deze vraag ook niet officieel onbeantwoord laten – en ik haat het om mijn eigen antwoord op de vraag te accepteren – maar ik heb Linker3000’s antwoord als bedankje opgepikt!)

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

Als de actie alleen is om gewijzigde bestanden te kopiëren, kunt u robocopy /MON

gebruiken Weet niet of robocopy FileSystemWatcher gebruikt of werkt door te peilen naar wijzigingen.

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

Of u kunt gebruik maken van Watch 4 Folder . Blijkbaar is het Freeware, draagbaar en compatibel met Windows 7. Ik heb het niet geprobeerd, maar vond het via een zoektocht op het web en dacht het door te geven.

Ik vind het VBS-script ook mooi, ook op de site.

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

U kunt kijken naar DropIt (gratis). Het programma is geschikt voor het verwerken van binnenkomende bestanden op een aantal geautomatiseerde manieren. U kunt de parameters verplaatsen, kopiëren, verwijderen en doorgeven aan andere commandoregelprogramma’s om afbeeldingen te converteren, PDF’s te splitsen, enz.

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

Vond ook watchman die vrij groot lijkt, en een kleinere watchexec heb ik niet geprobeerd.

Watchman voelt prettig en programmatisch. Een CLI-hulpprogramma voor stroomgebruikers.

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

We gebruiken de commerciële tool (d.w.z. niet gratis) Folder Poll van http://www.myassays.com/folder-poll om dit te doen. Het is een Windows-toepassing die een gebruiksvriendelijke beheerdersapplicatie bevat die een eenvoudige configuratie mogelijk maakt. Er is ook een XML-configuratieoptie. De eigenlijke mappoll loopt als een Windows-service (dus start automatisch bij elke herstart). Wanneer een nieuw bestand wordt gedetecteerd in een gepeilde map kan een applicatie automatisch worden gestart (u kunt uw eigen aangepaste commandoregelargumenten opgeven). Het kan ook andere dingen doen zoals bestanden kopiëren/verplaatsen. Ook kan activiteit worden gelogd in een logbestand en zijn er andere geavanceerde bewerkingen.