Bagaimana cara memantau folder dan memicu tindakan baris perintah ketika file dibuat atau diedit?

82

Saya perlu mengatur semacam script pada mesin Vista saya, sehingga setiap kali file ditambahkan ke folder tertentu, secara otomatis memicu proses latar belakang yang beroperasi pada file tersebut. (Proses latar belakang hanyalah utilitas baris perintah yang menggunakan nama file sebagai argumen, bersama dengan beberapa opsi yang telah ditentukan sebelumnya.)

Saya ingin melakukan ini menggunakan fitur Windows asli, jika mungkin, untuk alasan kinerja dan pemeliharaan. Saya telah melihat ke dalam menggunakan Penjadwal Tugas, tetapi setelah membaca sebentar tentang sistem pemicu, saya belum bisa memahaminya, dan saya bahkan tidak yakin apakah itu mampu melakukan apa yang saya butuhkan.

Saya menghargai saran apa pun. Terima kasih!

bigmattyh
sumber
Sepertinya Anda perlu sesuatu seperti Linux tidak berlaku, tetapi untuk windows. Jnotify mungkin membantu, tetapi karena Java mungkin terlalu berat.
Keith
1
Saya juga bertanya-tanya tentang ini ... menemukan [halaman MSDN] ( msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx) .
Keith
2
Tautan di atas memiliki) setelah aspx: msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx
Sun

Jawaban:

92

Di tempat kerja kami menggunakan Powershell untuk memantau folder.
Ini dapat digunakan karena Windows Vista (.NET dan PowerShell sudah diinstal sebelumnya) tanpa alat tambahan.

Script ini memonitor folder tertentu dan menulis file log. Anda dapat mengganti tindakan dan melakukan apa pun yang Anda inginkan misalnya memanggil alat eksternal

Contoh file log

11/23/2014 19:22:04, Dibuat, D: \ source \ New Text Document.txt
11/23/2014 19:22:09, Berubah, D: \ source \ New Text Document.txt
11/23/2014 19:22:09, Berubah, D: \ source \ New Text Document.txt
11/23/2014 19:22:14, Dihapus, 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}

Cara Penggunaan

  1. Buat file teks baru
  2. Salin & tempel kode di atas
  3. Ubah pengaturan berikut untuk kebutuhan Anda sendiri:
    • folder untuk dipantau: $watcher.Path = "D:\source"
    • filter file untuk menyertakan hanya tipe file tertentu: $watcher.Filter = "*.*"
    • termasuk subdirektori ya / tidak: $watcher.IncludeSubdirectories = $true
  4. Simpan dan ganti nama menjadi StartMonitoring.ps1
  5. Mulai pemantauan dengan Klik kanan »Jalankan dengan PowerShell

Untuk berhenti memantau, cukup menutup jendela PowerShell Anda

Bacaan lebih lanjut

nixda
sumber
Berfungsi dengan baik tetapi apa fungsi dari skrip berhenti? Saya mendapatkan kesalahan: "Unregister-Event: Tidak dapat mengikat argumen ke parameter 'SourceIdentifier' karena itu nol." pastebin.com/ugLB3a69
Jan Stanstrup
@ JanStanstrup Saya mungkin bingung lebih banyak orang dengan skrip kedua. Saya akan menghapusnya. Cukup menutup StartWatching.ps1jendela Anda untuk menghentikan pemantauan. Script kedua tidak hanya bekerja jika Anda memasukkannya dalam naskah pertama Anda untuk menyimpan variabel $created, $changed, $deletedatau$renamed
nixda
Terima kasih atas jawabannya. Adakah yang bisa menyarankan jika kita dapat menggunakan cmd prompt karena saya ingin mengunggah file ke github ketika diubah
m__
5

Anda tampaknya berada di baris yang benar - Anda dapat menggunakan penjadwal tugas untuk menjalankan file .bat atau .cmd secara teratur dan file itu dapat dimulai dengan garis untuk memeriksa keberadaan file yang diperlukan - pada kenyataannya, saya akan memeriksa tidak adanya file; sebagai contoh:

@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

Anda juga bisa memodifikasi kode ini dan menjalankannya dalam satu lingkaran dengan, katakanlah, penundaan 1 menit dalam loop dan kemudian meletakkan referensi ke file batch di folder startup 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

Ada cara lain untuk mencapai penundaan sesuai dengan versi Windows yang berjalan dan kit sumber daya tambahan apa yang telah diinstal, tetapi perintah PING cukup banyak bekerja dalam semua keadaan. Dalam perintah PING di atas, PING 10 phantom dieksekusi dengan penundaan 6000ms (yaitu: 6 detik) di antara mereka, Anda dapat bermain dengan nilai-nilai ini untuk mencapai penundaan yang Anda butuhkan antara loop file batch.

Linker3000
sumber
ide bagus .. btw, C: \> ping 1.1.1.1 -n 10 -w 6000 untuk beberapa alasan butuh 1 menit 10 detik di komputer saya. tapi -n 1 -w 60000 mengambil 1 menit tepatnya.
barlop
@barlop - sepuluh perbedaan kedua adalah karena -n 10vs -n 1.
@Randolph Potter Bukankah 10 lot 6 detik, 60 detik? dan -n 10 yang Anda gunakan, harus berarti 10 kali.
barlop
Kamu mungkin benar. Saya mengambilnya kembali dan menyalahkan rambut pirang saya.
Saya akhirnya menggunakan loop ini untuk batch pemantauan IF NOT EXIST C:\NO_SUCH_FILE_EVER.foo. Meretas, tetapi berhasil. Terima kasih untuk idenya.
Snekse
3

Terima kasih atas sarannya.

Saya akhirnya menulis VBScript yang secara kasar didasarkan pada ide Linker3000 tentang polling folder, dan menggunakan Penjadwal Tugas untuk menjalankannya pada startup. Saya akhirnya mendapatkan sintaks dasar dari sumber ini dan membuat tweak yang diperlukan.

Saya masih ingin mengoptimalkannya di beberapa titik, memiliki nyali script berjalan pada sistem yang digerakkan oleh peristiwa, tapi saya sudah kehabisan waktu untuk mengerjakannya, dan, yah, ini cukup bagus.

Berikut skripnya, siapa tahu ada yang tertarik (dengan segmen konversi yang tidak relevan dihapus untuk kejelasan):

' 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

(Juga, saya tidak ingin meninggalkan pertanyaan ini secara resmi tidak terjawab - dan saya benci menerima jawaban saya sendiri atas pertanyaan - tetapi saya benar-benar memilih jawaban Linker3000 sebagai ucapan terima kasih!)

bigmattyh
sumber
2

Anda mungkin melihat DropIt (gratis). Program ini sesuai untuk memproses file yang masuk dengan beberapa cara otomatis. Anda dapat memindahkan, menyalin, menghapus, dan meneruskan parameter ke program baris perintah lainnya untuk mengonversi gambar, membagi PDF, dll.

Matahari
sumber
2

Jika tindakan ini hanya untuk menyalin file yang diubah, Anda dapat menggunakan robocopy / MON

Tidak tahu apakah robocopy menggunakan FileSystemWatcher atau berfungsi dengan polling untuk perubahan

weberjn
sumber
1

Atau Anda bisa menggunakan Folder Watch 4 . Ternyata itu Freeware, portable, dan kompatibel dengan Windows 7. Saya belum mencobanya, tetapi menemukannya melalui pencarian web dan berpikir saya akan meneruskannya.

Saya suka script VBS juga, juga ditampilkan di situs.

Chris
sumber
Sayangnya hanya versi berbayar yang portabel
nixda
Sedang berpikir tentang menggunakan perangkat lunak ini. Apakah Anda percaya untuk memantau berbagi jaringan dengan file-file penting dari banyak pengguna?
Paul Matthews
Versi gratis Watch4Folder hanya memiliki satu entri "sampel" yang dapat dikonfigurasi.
PeterCo
0

Kami menggunakan alat komersial (yaitu tidak gratis) Folder Poll dari http://www.myassays.com/folder-poll untuk melakukan hal ini. Ini adalah aplikasi Windows yang menyertakan aplikasi manajer yang mudah digunakan untuk memungkinkan konfigurasi yang mudah. Juga, ada opsi konfigurasi XML. Polling folder aktual berjalan sebagai layanan Windows (jadi mulai secara otomatis pada setiap restart). Ketika file baru terdeteksi dalam folder yang disurvei, aplikasi dapat diluncurkan secara otomatis (Anda dapat menentukan argumen baris perintah khusus Anda sendiri). Itu dapat melakukan hal-hal lain seperti menyalin / memindahkan file juga. Juga, aktivitas dapat dicatat ke file log dan ada operasi lanjutan lainnya.

Tuan Cook
sumber