73

Мне нужно установить какой-то сценарий на моем компьютере с Vista, чтобы всякий раз, когда файл добавлялся в определенную папку, он автоматически запускал фоновый процесс, который работает с файлом. (Фоновый процесс - это просто утилита командной строки, которая принимает имя файла в качестве аргумента вместе с некоторыми другими предопределенными параметрами.)

Я хотел бы сделать это, используя встроенные функции Windows, если это возможно, из соображений производительности и обслуживания. Я изучал использование планировщика заданий, но после некоторого изучения системы триггеров у меня не получилось осознать это, и я даже не уверен, что она способна делать то, что мне нужно.

Буду признателен за любые предложения. Спасибо!

8 ответов8

80

На работе мы используем Powershell для мониторинга папок.
Его можно использовать начиная с Windows Vista (предварительно установлены .NET и PowerShell) без каких-либо дополнительных инструментов.

Этот скрипт контролирует определенную папку и записывает файл журнала. Вы можете заменить действие и делать все, что хотите, например, вызвать внешний инструмент

Пример файла журнала

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}

Как пользоваться

  1. Создать новый текстовый файл
  2. Скопируйте и вставьте вышеуказанный код
  3. Измените следующие настройки в соответствии со своими потребностями:
    • папка для мониторинга: $watcher.Path = "D:\source"
    • Фильтр файлов для включения только определенных типов файлов: $watcher.Filter = "*.*"
    • включить подкаталоги да / нет: $watcher.IncludeSubdirectories = $true
  4. Сохраните и переименуйте его в StartMonitoring.ps1
  5. Начать мониторинг правой кнопкой мыши »Выполнить с помощью PowerShell

Чтобы остановить мониторинг, достаточно закрыть окно PowerShell.

дальнейшее чтение

5

Вы, кажется, находитесь на правильных строках - вы можете использовать планировщик задач для регулярного запуска файла .bat или .cmd, и этот файл может начинаться со строки, чтобы проверить наличие необходимого файла - на самом деле, я проверил бы на отсутствие файла; например:

@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

Вы также можете изменить этот код и запустить его в цикле, скажем, с задержкой в 1 минуту в цикле, а затем поместить ссылку на пакетный файл в папку автозагрузки Windows:

@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

Существуют и другие способы достижения задержки в зависимости от версии запущенной Windows и того, какие дополнительные комплекты ресурсов были установлены, но команда PING в значительной степени работает при любых обстоятельствах. В приведенной выше команде PING 10 фантомных PINGS выполняются с задержкой в 6000 мс (то есть: 6 секунд) между ними, вы можете поиграть с этими значениями, чтобы добиться необходимой задержки между циклами пакетного файла.

3

Спасибо всем за предложения.

Я закончил тем, что написал VBScript, который был примерно основан на идее Linker3000 опрашивать папку и использовать планировщик задач, чтобы он запускался при запуске. В итоге я получил основной синтаксис от этого ресурса и внес необходимые изменения.

Я все еще хотел бы оптимизировать его в какой-то момент, запустив весь сценарий в управляемой событиями системе, но у меня не хватило времени, чтобы поработать над этим, и, ну, это достаточно хорошо.

Вот сценарий, на случай, если кому-то интересно (с несоответствующим сегментом преобразования, отредактированным для ясности):

' 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

(Кроме того, я не хочу оставлять этот вопрос официально без ответа - и мне неприятно принимать мой собственный ответ на вопрос - но я действительно проголосовал за ответ Linker3000 в качестве благодарности!)

2

Если действие просто копировать измененные файлы, вы можете использовать robocopy /MON

Не знаю, использует ли robocopy FileSystemWatcher или работает путем опроса изменений

1

Вы можете посмотреть на DropIt (бесплатно). Программа подходит для обработки входящих файлов некоторыми автоматическими способами. Вы можете перемещать, копировать, удалять и передавать параметры в другие программы командной строки для преобразования изображений, разделения PDF-файлов и т.д.

1

Или вы можете использовать Watch 4 Folder. По-видимому, это бесплатная, портативная и совместимая с Windows 7. Я не пробовал это, но нашел это через поиск в сети и думал, что передам это.

Мне также нравится сценарий VBS, также размещенный на сайте.

1

Также нашел сторожа, который кажется довольно большим, и меньший watchexec, который я не пробовал.

0

Мы используем коммерческий инструмент (т.е. не бесплатный) Folder Poll с http://www.myassays.com/folder-poll, чтобы сделать это. Это приложение для Windows, которое включает в себя удобное приложение-менеджер для упрощения настройки. Кроме того, есть опция конфигурации XML. Фактический опрос папок выполняется как служба Windows (поэтому запускается автоматически при каждом перезапуске). При обнаружении нового файла в папке опроса приложение может автоматически запускаться (вы можете указать свои собственные аргументы командной строки). Это может делать другие вещи, такие как копирование / перемещение файлов тоже. Кроме того, активность может быть записана в файл журнала и существуют другие дополнительные операции.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .