I need to set up some sort of a script on my Vista machine, so that whenever a file is added to a particular folder, it automatically triggers a background process that operates on the file. (The background process is just a command-line utility that takes the file name as an argument, along with some other predefined options.)

I'd like to do this using native Windows features, if possible, for performance and maintenance reasons. I've looked into using Task Scheduler, but after perusing the trigger system for a while, I haven't been able to make much sense of it, and I'm not even sure if it's capable of doing what I need.

I'd appreciate any suggestions. Thanks!


At work we use Powershell to monitor folders.
It can be used since Windows Vista (.NET and PowerShell is preinstalled) without any additional tools.

This script monitors a certain folder and writes a logfile. You can replace the action and do whatever you want e.g call an external tool

Example log file

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


    $watcher = New-Object System.IO.FileSystemWatcher
    $watcher.Path = "D:\source"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $true
    $watcher.EnableRaisingEvents = $true  

    $action = { $path = $Event.SourceEventArgs.FullPath
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "D:\log.txt" -value $logline
    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}

How to use

  1. Create a new text file
  2. Copy & paste the above code
  3. Change the following settings to your own needs:
    • folder to monitor: $watcher.Path = "D:\source"
    • file filter to include only certain file types: $watcher.Filter = "*.*"
    • include subdirectories yes/no: $watcher.IncludeSubdirectories = $true
  4. Save and rename it to StartMonitoring.ps1
  5. Start monitoring by Right click ยป Execute with PowerShell

To stop monitoring, it's enough to close your PowerShell window

Further reading

| improve this answer | |
  • Works nicely but what is the function of the stop script? I get on errors: "Unregister-Event : Cannot bind argument to parameter 'SourceIdentifier' because it is null." pastebin.com/ugLB3a69 – Jan Stanstrup Nov 18 '16 at 13:45
  • @JanStanstrup I probably confused more people with the second script. I'll delete it. It's enough to simply close your StartWatching.ps1 window to stop the monitoring. The second script does only work if you include it in your first script to save the variables $created, $changed, $deleted or $renamed – nixda Nov 18 '16 at 13:59
  • Thanks for the answer. Can anyone suggest if we could use cmd prompt as I want to upload the files to github when changed – mayank1513 Aug 19 '19 at 8:38
  • Combining this answer with A PowerShell Windows service, you won't have to leave a PowerShell window open to watch a directory. – Stack Underflow Apr 23 at 18:26

You seem to be on the right lines - you could use the task scheduler to run a .bat or .cmd file on a regular basis and that file could start with a line to check for the existence of the required file - in fact, I'd check for the non existence of the file; for example:

REM Example file
REM All this gets done if the file exists...

You could also modify this code and have it run in a loop with a, say, 1 minute delay in the loop and then put a reference to the batch file in the Windows startup folder:

REM Example file
REM All this gets done if the file exists...
REM Crafty 1 minute delay...
PING -n 10 -w 6000 >NUL

There are other ways of achieving a delay according to the version of Windows running and what additional resource kits have been installed, but the PING command pretty much works under all circumstances. In the PING command above, 10 phantom PINGS are executed with a delay of 6000ms (ie: 6 seconds) between them, you can play with these values to achieve the delay you need between batch file loops.

| improve this answer | |
  • nice idea.. btw, C:\>ping -n 10 -w 6000 for some reason took 1min 10 seconds on my computer. but -n 1 -w 60000 took 1min exactly. – barlop Dec 29 '10 at 12:14
  • @barlop - the ten second discrepancy is due to the -n 10 vs -n 1. – user3463 Dec 30 '10 at 2:24
  • @Randolph Potter Isn't 10 lots of 6 seconds, 60 seconds? and -n 10 that you use, should mean 10 times. – barlop Dec 30 '10 at 9:13
  • You're probably right. I take it back and blame my blond hair. – user3463 Dec 30 '10 at 20:52
  • I ended up using this loop for a monitoring batch IF NOT EXIST C:\NO_SUCH_FILE_EVER.foo. Hackish, but it works. Thanks for the idea. – Snekse Jul 1 '12 at 0:29

Thanks all, for the suggestions.

I ended up writing a VBScript that was roughly based on Linker3000's idea of polling the folder, and using the Task Scheduler to have it run on startup. I ended up getting the basic syntax from this resource and made the requisite tweaks.

I'd still like to optimize it at some point, having the guts of the script run on an event-driven system, but I've run out of time to work on it, and, well, this is good enough.

Here's the script, in case anyone's interested (with the irrelevant conversion segment redacted for clarity):

strFolder = "J:\monitored-folder"

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 & """'") 

    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"

    ' ...

(Also, I don't want to leave this question officially unanswered -- and I hate to accept my own answer to the question -- but I did upvote Linker3000's answer as a thanks!)

| improve this answer | |

You might look at DropIt (free). The program is appropriate for processing incoming files in some automated ways. You can move, copy, delete, and pass parameters to other command line programs to convert images, split PDFs, etc.

| improve this answer | |
  • quite a few similar file and dir monitors at portablefreeware.com/index.php?sc=65 – Scott R Apr 19 at 13:55
  • What's your point though? Did you see if any of the programs do what the OP wants? Otherwise, what's the point of linking to a bunch of folder watch programs... Dive deeper and provide an answer. – Sun Apr 20 at 16:53

If the action is just to copy changed files, you can use robocopy /MON

Don't know if robocopy uses FileSystemWatcher or works by polling for changes

| improve this answer | |
  • Error: Invalid Parameter: /mon – Roland Mar 30 at 14:12
  • ok, the option is not /MON, but /MON:1. I tried, and the default is also /MOT:1, for polling every 1 minute. /MOT:0 also polls every 1 minute. This clears up the issue of FileSystemWatcher: no, it does polling. – Roland Apr 1 at 8:31

Also found watchman that seems to be pretty big, and a smaller watchexec I haven't tried.

Watchman feels nice and programmatic. A CLI utility for power users.

| improve this answer | |

Or you could use Watch 4 Folder. Apparently it's Freeware, portable, and compatible with Windows 7. I haven't tried it, but found it through a web search and thought I'd pass it on.

I like the VBS script too, also featured on the site.

| improve this answer | |
  • Unfortunately only the paid version is portable – nixda Jul 12 '13 at 10:10
  • Was thinking about using this software. Would you trust it to monitor a network share with important files from many users? – Paul Matthews Jul 22 '15 at 4:56
  • The free version of Watch4Folder has only one "sample" entry which can be configured. – PeterCo Jul 4 '19 at 16:32

We use the commercial tool (i.e. not free) Folder Poll from http://www.myassays.com/folder-poll to do just this. It's a Windows application that includes a user-friendly manager application to allow easy configuration. Also, there is an XML configuration option. The actual folder polling runs as a Windows service (so starts automatically on each restart). When a new file is detected in a polled folder an application can be launched automatically (you can specify your own custom command line arguments). It can do other things like copy/move files too. Also, activity can be logged to a log file and there are other advanced operations.

| improve this answer | |

Not the answer you're looking for? Browse other questions tagged or ask your own question.