Làm cách nào để giám sát thư mục và kích hoạt hành động dòng lệnh khi tệp được tạo hoặc chỉnh sửa?


82

Tôi cần thiết lập một số loại tập lệnh trên máy Vista của mình để bất cứ khi nào một tệp được thêm vào một thư mục cụ thể, nó sẽ tự động kích hoạt một quy trình nền hoạt động trên tệp. (Quá trình nền chỉ là một tiện ích dòng lệnh lấy tên tệp làm đối số, cùng với một số tùy chọn được xác định trước khác.)

Tôi muốn làm điều này bằng các tính năng Windows gốc, nếu có thể, vì lý do hiệu suất và bảo trì. Tôi đã xem xét sử dụng Trình lập lịch tác vụ, nhưng sau khi xem qua hệ thống kích hoạt một lúc, tôi không thể hiểu được ý nghĩa của nó, và tôi thậm chí không chắc nó có khả năng làm những gì tôi cần không.

Tôi đánh giá cao bất kỳ đề xuất. Cảm ơn!


Âm thanh như bạn cần đôi khi như inotify của Linux, nhưng đối với các cửa sổ. Jnotify có thể giúp ích, nhưng vì Java có thể quá nặng.
Keith

1
Tôi cũng đã tự hỏi về điều này ... đã tìm thấy [trang MSDN] ( msdn.microsoft.com/en-us/l Library / aa365261 ( VS85) .aspx) .
Keith

2
Liên kết ở trên có) sau aspx: msdn.microsoft.com/en-us/l Library / aa365261 (VS85
nhật

Câu trả lời:


92

Trong công việc, chúng tôi sử dụng Powershell để theo dõi các thư mục.
Nó có thể được sử dụng vì Windows Vista (.NET và PowerShell được cài đặt sẵn) mà không cần bất kỳ công cụ bổ sung nào.

Kịch bản này theo dõi một thư mục nhất định và viết một logfile. Bạn có thể thay thế hành động và làm bất cứ điều gì bạn muốn, ví dụ như gọi một công cụ bên ngoài

Tệp nhật ký mẫu

23/11/2014 19:22:04, Đã tạo, D: \ source \ Tài liệu văn bản mới
23/11/2014 19:22:09, Đã thay đổi, D: \ source \ Tài liệu văn bản mới
23/11/2014 19:22:09, Đã thay đổi, D: \ source \ Tài liệu văn bản mới
23/11/2014 19:22:14, Đã xóa, D: \ source \ Tài liệu văn bản mới

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}

Cách sử dụng

  1. Tạo một tệp văn bản mới
  2. Sao chép và dán mã ở trên
  3. Thay đổi các cài đặt sau theo nhu cầu của riêng bạn:
    • thư mục để theo dõi: $watcher.Path = "D:\source"
    • bộ lọc tệp chỉ bao gồm các loại tệp nhất định: $watcher.Filter = "*.*"
    • bao gồm các thư mục con có / không: $watcher.IncludeSubdirectories = $true
  4. Lưu và đổi tên thành StartMonitoring.ps1
  5. Bắt đầu theo dõi bằng cách nhấp chuột phải »Thực thi với PowerShell

Để dừng theo dõi, đủ để đóng cửa sổ PowerShell của bạn

đọc thêm


Hoạt động độc đáo nhưng chức năng của tập lệnh dừng là gì? Tôi gặp lỗi: "Unregister-Event: Không thể liên kết đối số với tham số 'SourceIdentifier' vì nó là null." pastebin.com/ugLB3a69
Jan Stanstrup

@JanStanstrup Có lẽ tôi đã nhầm lẫn nhiều người hơn với kịch bản thứ hai. Tôi sẽ xóa nó. Chỉ cần đóng StartWatching.ps1cửa sổ của bạn để dừng giám sát là đủ. Kịch bản thứ hai không chỉ có tác dụng nếu bạn đưa nó vào trong kịch bản đầu tiên của bạn để lưu các biến $created, $changed, $deletedhoặc$renamed
nixda

Cảm ơn câu trả lời. Bất cứ ai có thể đề nghị nếu chúng tôi có thể sử dụng dấu nhắc cmd vì tôi muốn tải các tệp lên github khi thay đổi
m__

5

Bạn dường như đang đi đúng dòng - bạn có thể sử dụng bộ lập lịch tác vụ để chạy tệp .bat hoặc .cmd một cách thường xuyên và tệp đó có thể bắt đầu bằng một dòng để kiểm tra sự tồn tại của tệp được yêu cầu - thực tế, tôi 'd kiểm tra sự không tồn tại của tập tin; ví dụ:

@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

Bạn cũng có thể sửa đổi mã này và để nó chạy trong một vòng lặp với độ trễ 1 phút trong vòng lặp và sau đó đặt tham chiếu đến tệp bó trong thư mục khởi động 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

Có nhiều cách khác để đạt được độ trễ theo phiên bản Windows đang chạy và bộ công cụ tài nguyên bổ sung nào đã được cài đặt, nhưng lệnh PING hoạt động khá nhiều trong mọi trường hợp. Trong lệnh PING ở trên, 10 PING ảo được thực thi với độ trễ 6000ms (nghĩa là: 6 giây) giữa chúng, bạn có thể chơi với các giá trị này để đạt được độ trễ bạn cần giữa các vòng tệp bó.


ý tưởng hay .. btw, C: \> ping 1.1.1.1 -n 10 -w 6000 vì một số lý do mất 1 phút 10 giây trên máy tính của tôi. nhưng -n 1 -w 60000 mất chính xác 1 phút.
barlop

@barlop - sự khác biệt thứ hai mười là do sự -n 10vs -n 1.

@Randolph Potter Không phải là 10 lô 6 giây, 60 giây sao? và -n 10 mà bạn sử dụng, có nghĩa là 10 lần.
barlop

Bạn có thể đúng. Tôi lấy lại và đổ lỗi cho mái tóc vàng của mình.

Tôi đã kết thúc việc sử dụng vòng lặp này cho một đợt giám sát IF NOT EXIST C:\NO_SUCH_FILE_EVER.foo. Hackish, nhưng nó hoạt động. Cảm ơn ý tưởng.
Snekse

3

Cảm ơn tất cả những lời đề nghị.

Cuối cùng tôi đã viết một VBScript dựa trên ý tưởng thăm dò thư mục của Linker3000 và sử dụng Trình lập lịch tác vụ để chạy nó khi khởi động. Cuối cùng tôi đã nhận được cú pháp cơ bản từ tài nguyên này và thực hiện các điều chỉnh cần thiết.

Tôi vẫn muốn tối ưu hóa nó vào một lúc nào đó, có sự can đảm của kịch bản chạy trên một hệ thống hướng sự kiện, nhưng tôi đã hết thời gian để làm việc với nó, và, điều này là đủ tốt.

Đây là tập lệnh, trong trường hợp bất kỳ ai quan tâm (với phân đoạn chuyển đổi không liên quan được xử lý lại cho rõ ràng):

' 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

.


2

Bạn có thể nhìn vào DropIt (miễn phí). Chương trình phù hợp để xử lý các tệp đến theo một số cách tự động. Bạn có thể di chuyển, sao chép, xóa và truyền tham số cho các chương trình dòng lệnh khác để chuyển đổi hình ảnh, tách tệp PDF, v.v.


2

Nếu hành động chỉ là sao chép các tập tin đã thay đổi, bạn có thể sử dụng robocopy / MON

Không biết nếu robocopy sử dụng FileSystemWatcher hoặc hoạt động bằng cách bỏ phiếu cho các thay đổi


1

Hoặc bạn có thể sử dụng Thư mục Watch 4 . Rõ ràng đó là Phần mềm miễn phí, di động và tương thích với Windows 7. Tôi chưa dùng thử, nhưng đã tìm thấy nó thông qua một tìm kiếm trên web và nghĩ rằng tôi đã vượt qua nó.

Tôi cũng thích kịch bản VBS, cũng được giới thiệu trên trang web.


Thật không may, chỉ có phiên bản trả phí là xách tay
nixda

Đã suy nghĩ về việc sử dụng phần mềm này. Bạn có tin tưởng nó để theo dõi chia sẻ mạng với các tệp quan trọng từ nhiều người dùng không?
Paul Matthews

Phiên bản miễn phí của Watch4Folder chỉ có một mục "mẫu" có thể được định cấu hình.
PeterCo


0

Chúng tôi sử dụng công cụ thương mại (tức là không miễn phí) Thăm dò thư mục từ http://www.myassays.com/folder-poll để làm việc này. Đây là một ứng dụng Windows bao gồm ứng dụng quản lý thân thiện với người dùng để cho phép cấu hình dễ dàng. Ngoài ra, có một tùy chọn cấu hình XML. Việc bỏ phiếu thư mục thực tế chạy như một dịch vụ Windows (vì vậy sẽ tự động bắt đầu mỗi lần khởi động lại). Khi một tệp mới được phát hiện trong thư mục được thăm dò, ứng dụng có thể được khởi chạy tự động (bạn có thể chỉ định các đối số dòng lệnh tùy chỉnh của riêng mình). Nó có thể làm những việc khác như sao chép / di chuyển tập tin quá. Ngoài ra, hoạt động có thể được ghi vào một tệp nhật ký và có các hoạt động nâng cao khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.