Як слідкувати за папкою та запускати дії командного рядка, коли файл створюється чи редагується?


82

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

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

Буду вдячний за будь-які пропозиції. Дякую!


Здається, що вам потрібно щось думати, як Linux inotify, але для Windows. Jnotify може допомогти, але оскільки Java може бути занадто важкою.
Кіт

1
Мені теж було цікаво про це… знайшов [сторінку MSDN] ( msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx) .
Кіт

2
Посилання вище) після aspx: msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx
Нд

Відповіді:


92

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

Цей скрипт відстежує певну папку і записує файл журналу. Ви можете замінити дію і робити все, що завгодно, наприклад, зателефонувати на зовнішній інструмент

Приклад файлу журналу

23.11.2014 19:22:04, створено, D: \ source \ Новий текстовий документ.txt
23.11.2014 19:22:09, змінено, D: \ source \ Новий текстовий документ.txt
23.11.2014 19:22:09, змінено, D: \ source \ Новий текстовий документ.txt
23.11.2014 19:22:14, видалено, D: \ source \ Новий текстовий документ.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

Подальше читання


Добре працює, але яка функція стоп-скрипта? Я отримую помилки: "Unregister-Event: Неможливо прив’язати аргумент до параметра" SourceIdentifier ", оскільки він є нульовим." pastebin.com/ugLB3a69
Jan Stanstrup

@JanStanstrup Я, мабуть, плутав більше людей із другим сценарієм. Я його видалю. Досить просто закрити StartWatching.ps1вікно, щоб зупинити моніторинг. Другий скрипт працює тільки , якщо ви дозволите його в свій перший сценарій , щоб зберегти змінні $created, $changed, $deletedабо$renamed
nixda

Дякую за відповідь. Чи хтось може підказати, чи можемо ми використовувати підказку cmd, оскільки я хочу завантажити файли в github при зміні
m__

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


приємна ідея .. btw, C: \> ping 1.1.1.1 -n 10 -w 6000 чомусь зайняв 1 хв 10 секунд на моєму комп’ютері. але -n 1 -w 60000 займає точно 1 хв.
барлоп

@barlop - десять Друга розбіжність пов'язано з -n 10VS -n 1.

@Randolph Potter Чи не 10 партій 6 секунд, 60 секунд? і -n 10, яке ви використовуєте, повинно означати 10 разів.
барлоп

Ви, мабуть, праві. Я повертаю її назад і звинувачую своє світле волосся.

Я закінчив використовувати цю петлю для моніторингової партії IF NOT EXIST C:\NO_SUCH_FILE_EVER.foo. Хакіш, але це працює. Дякую за ідею.
Снексе

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

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


2

Якщо дія полягає лише в копіюванні змінених файлів, ви можете використовувати robocopy / MON

Не знаю, чи роботокопія використовує FileSystemWatcher чи працює, опитуючи зміни


1

Або ви можете використовувати папку Watch 4 . Мабуть, вона безкоштовна, портативна і сумісна з Windows 7. Я не пробував її, але знайшов її через пошук в Інтернеті і думав, що передам це.

Мені також подобається сценарій VBS, також розміщений на сайті.


На жаль, портативна версія є лише платною
nixda

Думав про використання цього програмного забезпечення. Чи можете ви довіряти йому контролювати мережевий доступ до важливих файлів багатьох користувачів?
Пол Меттьюз

У безкоштовній версії Watch4Folder є лише один "зразок" запису, який можна налаштувати.
PeterCo


0

Ми використовуємо комерційний інструмент (тобто не безкоштовний) опитування папок від http://www.myassays.com/folder-poll, щоб зробити саме це. Це додаток для Windows, що включає в себе зручну програму менеджера, яка дозволяє легко конфігурувати. Також є параметр конфігурації XML. Фактичне опитування папок працює як служба Windows (тому автоматично запускається при кожному перезапуску). При виявленні нового файлу в опитуваній папці програма може запускатися автоматично (ви можете вказати власні аргументи командного рядка). Він може робити і інші речі, такі як копіювання / переміщення файлів. Крім того, діяльність може бути зареєстрована у файлі журналу, а також є інші вдосконалені операції.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.