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

Jak monitorować folder i uruchamiać akcję z wiersza poleceń podczas tworzenia lub edycji pliku?

Muszę skonfigurować jakiś skrypt na komputerze z systemem Vista, aby za każdym razem, gdy plik jest dodawany do konkretnego folderu, automatycznie uruchamiał proces w tle, który działa na tym pliku. (Proces w tle jest tylko narzędziem z linii poleceń, które przyjmuje nazwę pliku jako argument, wraz z kilkoma innymi predefiniowanymi opcjami)

Chciałbym to zrobić przy użyciu natywnych funkcji Windows, jeśli to możliwe, ze względu na wydajność i utrzymanie. Zastanawiałem się nad użyciem Task Scheduler'a, ale po dłuższej przerwie w używaniu systemu wyzwalającego, nie byłem w stanie zrobić z tego zbyt wiele i nawet nie jestem pewien czy jest on w stanie zrobić to, czego potrzebuję.

Będę wdzięczny za wszelkie sugestie. Dzięki!

Odpowiedzi (8)

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

W pracy używamy Powershell do monitorowania folderów. Może być używany od Windows Vista (.NET i PowerShell jest preinstalowany) bez żadnych dodatkowych narzędzi.

Ten skrypt monitoruje określony folder i zapisuje plik dziennika. Możesz wymienić akcję i zrobić co chcesz, np. wywołać zewnętrzne narzędzie

Przykładowy plik dziennika

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}

Jak używać

  1. Stwórz nowy plik tekstowy
  2. Skopiuj i wklej powyższy kod
  3. Zmień następujące ustawienia na własne potrzeby:
  4. folder do monitorowania: $watcher.Path = "D:\source"
  5. filtr plików zawierający tylko niektóre typy plików: $watcher.Filter = "*.*"
  6. zawiera podkatalogi tak/nie: $watcher.IncludeSubdirectories = $true
  7. Zapisz i zmień nazwę na StartMonitoring.ps1
  8. Rozpocznij monitorowanie przez Kliknięcie prawym przyciskiem myszy “ Wykonaj za pomocą PowerShell

Aby zatrzymać monitorowanie, wystarczy zamknąć okno programu PowerShell

Dalszy odczyt

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

Wydajesz się być na właściwej linii - możesz użyć harmonogramu zadań do uruchomienia .bat lub . cmd i ten plik mógłby zacząć się od linii, aby sprawdzić, czy istnieje wymagany plik - w rzeczywistości sprawdziłbym, czy nie istnieje; na przykład:

@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

Mógłbyś również zmodyfikować ten kod i uruchomić go w pętli z, powiedzmy, 1 minutowym opóźnieniem w pętli, a następnie umieścić odniesienie do pliku wsadowego w folderze startowym 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

Istnieją inne sposoby uzyskania opóźnienia w zależności od wersji uruchomionego systemu Windows i tego, jakie dodatkowe zestawy zasobów zostały zainstalowane, ale komenda PING w zasadzie działa w każdych okolicznościach. W powyższej komendzie PING, 10 phantom PINGS jest wykonywanych z opóźnieniem 6000ms (tj. 6 sekund) pomiędzy nimi, możesz grać z tymi wartościami, aby osiągnąć potrzebne opóźnienie pomiędzy pętlami plików wsadowych.

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

Dziękuję wszystkim za sugestie.

Skończyło się na napisaniu VBScriptu, który w przybliżeniu opierał się na pomyśle Linker3000, aby przebadać ten folder i za pomocą Task Scheduler uruchomić go przy starcie. W końcu otrzymałem podstawową składnię z tego zasobu i wprowadziłem niezbędne poprawki.

Chciałbym go jeszcze kiedyś zoptymalizować, mając tupet skryptu uruchamianego na zdarzeniowym systemie, ale zabrakło mi czasu na pracę nad nim, i cóż, to jest wystarczająco dobre.

Oto skrypt, na wypadek gdyby ktoś był zainteresowany (z nieistotnym segmentem konwersji przeredagowanym dla jasności):

' 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

(Nie chcę też zostawiać tego pytania bez oficjalnej odpowiedzi – i nienawidzę akceptować własnej odpowiedzi na to pytanie – ale zagłosowałem za odpowiedzią Linker3000 jako podziękowanie!)

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

Jeśli akcja ma na celu tylko skopiowanie zmienionych plików, możesz użyć robocopy /MON

Nie wiem, czy robocopy używa FileSystemWatcher, czy działa poprzez ankiety na zmiany

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

Albo możesz użyć Watch 4 Folder . Podobno jest to Freeware, przenośny i kompatybilny z Windows 7. Nie próbowałem go, ale znalazłem go poprzez wyszukiwanie w sieci i pomyślałem, że przekażę go dalej.

Podoba mi się też skrypt VBS, który również znajduje się na stronie.

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

Możesz spojrzeć na DropIt (za darmo). Program jest odpowiedni do przetwarzania przychodzących plików w jakiś zautomatyzowany sposób. Możesz przenosić, kopiować, usuwać i przekazywać parametry do innych programów z linii poleceń w celu konwersji obrazów, dzielenia plików PDF, itp.

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

Znalazłem również stróża , który wydaje się być całkiem duży, i mniejszy watchexec nie próbowałem.

Strażnik czuje się ładnie i programowo. Narzędzie CLI dla użytkowników energii.

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

Do tego celu używamy komercyjnego narzędzia (tzn. nie jest ono darmowe) Folder Poll z http://www.myassays.com/folder-poll . Jest to aplikacja dla systemu Windows, która zawiera przyjazną dla użytkownika aplikację zarządzającą, umożliwiającą łatwą konfigurację. Dostępna jest również opcja konfiguracji XML. Rzeczywiste zapytanie o folder działa jako usługa systemu Windows (rozpoczyna się więc automatycznie przy każdym ponownym uruchomieniu). Po wykryciu nowego pliku w ankietowanym folderze aplikacja może zostać uruchomiona automatycznie (można określić własne argumenty z wiersza poleceń). Może ona również wykonywać inne czynności, takie jak kopiowanie/przenoszenie plików. Ponadto, aktywność może być zalogowana do pliku dziennika i istnieją inne zaawansowane operacje.