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

Как контролировать папку и запускать действие командной строки при создании или редактировании файла?

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

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

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

Ответы (8)

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

На работе мы используем 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. Измените следующие настройки на свои нужды:
  4. папка для мониторинга: $watcher.Path = "D:\source"
  5. файловый фильтр для включения только определенных типов файлов: $watcher.Filter = "*.*"
  6. включить подкаталоги да/нет: $watcher.IncludeSubdirectories = $true
  7. Сохраните и переименуйте его в StartMonitoring.ps1
  8. Начните мониторинг Right click “ Execute with PowerShell

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

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

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

Вы, кажется, на правильных строках - вы можете использовать планировщик задач для запуска .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 секунд) между ними, вы можете поиграть с этими значениями, чтобы достичь нужной вам задержки между циклами пакетных файлов.

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

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

в итоге я написал 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 в качестве благодарности!).

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

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

Не знаю, использует ли робокопирование FileSystemWatcher или работает, опрашивая за изменения

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

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

Мне тоже нравится VBS скрипт, который также есть на сайте.

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

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

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

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

сторож чувствует себя хорошо и программно. Утилита CLI для опытных пользователей.

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

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