วิธีการตรวจสอบโฟลเดอร์และเรียกใช้การกระทำบรรทัดคำสั่งเมื่อไฟล์ถูกสร้างหรือแก้ไข?


82

ฉันต้องตั้งค่าสคริปต์บางอย่างในเครื่อง Vista ของฉันดังนั้นเมื่อใดก็ตามที่มีการเพิ่มไฟล์ลงในโฟลเดอร์ใดไฟล์หนึ่งจะเป็นการเรียกใช้กระบวนการพื้นหลังที่ทำงานกับไฟล์โดยอัตโนมัติ (กระบวนการพื้นหลังเป็นเพียงอรรถประโยชน์บรรทัดคำสั่งที่ใช้ชื่อไฟล์เป็นอาร์กิวเมนต์พร้อมกับตัวเลือกอื่น ๆ ที่กำหนดไว้ล่วงหน้า)

ฉันต้องการทำสิ่งนี้โดยใช้คุณสมบัติ Windows ดั้งเดิมหากเป็นไปได้ด้วยเหตุผลด้านประสิทธิภาพและการบำรุงรักษา ฉันดูที่การใช้ตัวกำหนดเวลางาน แต่หลังจากตรวจดูระบบทริกเกอร์ชั่วครู่หนึ่งฉันไม่สามารถทำความเข้าใจได้และฉันไม่แน่ใจว่ามันสามารถทำสิ่งที่ฉันต้องการได้หรือไม่

ฉันขอขอบคุณข้อเสนอแนะใด ๆ ขอบคุณ!


ดูเหมือนคุณจะต้องคิดอะไรเหมือนลินุกซ์ที่รู้แจ้ง แต่สำหรับ windows Jnotifyอาจช่วยได้ แต่เนื่องจาก Java อาจมีน้ำหนักมากเกินไป
Keith

1
ผมสงสัยว่าเกี่ยวกับเรื่องนี้มากเกินไป ... พบ [MSDN หน้า] ( msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx)
Keith

2
ลิงค์ด้านบนมี) หลังจาก aspx: msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx
อาทิตย์ที่

คำตอบ:


92

ที่ทำงานเราใช้ Powershell เพื่อตรวจสอบโฟลเดอร์
สามารถใช้งานได้ตั้งแต่ Windows Vista (ติดตั้ง. NET และ PowerShell ไว้ล่วงหน้า) โดยไม่มีเครื่องมือเพิ่มเติมใด ๆ

สคริปต์นี้จะตรวจสอบโฟลเดอร์ที่แน่นอนและเขียนไฟล์บันทึก คุณสามารถแทนที่การกระทำและทำสิ่งที่คุณต้องการเช่นเรียกเครื่องมือภายนอก

ตัวอย่างไฟล์บันทึก

11/23/2014 19:22:04, สร้าง, D: \ source \ New Text Document.txt
11/23/2014 19:22:09, เปลี่ยน, D: \ source \ New Text Document.txt
11/23/2014 19:22:09, เปลี่ยน, D: \ source \ New Text Document.txt
11/23/2014 19:22:14, ถูกลบ, 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. เปลี่ยนการตั้งค่าต่อไปนี้ตามความต้องการของคุณ:
    • โฟลเดอร์ที่จะตรวจสอบ: $watcher.Path = "D:\source"
    • ตัวกรองไฟล์เพื่อรวมไฟล์บางประเภทเท่านั้น: $watcher.Filter = "*.*"
    • รวมไดเรกทอรีย่อยใช่ / ไม่ใช่: $watcher.IncludeSubdirectories = $true
  4. บันทึกและเปลี่ยนชื่อเป็น StartMonitoring.ps1
  5. เริ่มการตรวจสอบด้วยการคลิกขวา»ดำเนินการด้วย PowerShell

หากต้องการหยุดการตรวจสอบก็เพียงพอที่จะปิดหน้าต่าง PowerShell ของคุณ

อ่านเพิ่มเติม


ทำงานได้ดี แต่ฟังก์ชันของสคริปต์หยุดทำงานคืออะไร ฉันพบข้อผิดพลาด: "การถอนการลงทะเบียนเหตุการณ์: ไม่สามารถผูกอาร์กิวเมนต์กับพารามิเตอร์ 'SourceIdentifier' ได้เนื่องจากเป็นโมฆะ" pastebin.com/ugLB3a69
ม.ค. Stanstrup

@ JanStanstrup ฉันอาจสับสนผู้คนมากขึ้นด้วยสคริปต์ที่สอง ฉันจะลบมัน ก็พอที่จะปิดStartWatching.ps1หน้าต่างของคุณเพื่อหยุดการตรวจสอบ สคริปต์ที่สองไม่เพียงทำงานถ้าคุณรวมไว้ในสคริปต์ครั้งแรกของคุณที่จะบันทึกตัวแปร$created, $changed, $deletedหรือ$renamed
nixda

ขอบคุณสำหรับคำตอบ. ใครสามารถแนะนำถ้าเราสามารถใช้พรอมต์คำสั่งตามที่ฉันต้องการที่จะอัพโหลดไฟล์ไปยัง GitHub เมื่อเปลี่ยน
m__

5

คุณดูเหมือนจะอยู่ในบรรทัดที่ถูกต้อง - คุณสามารถใช้ task scheduler เพื่อรันไฟล์. 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

คุณสามารถปรับเปลี่ยนรหัสนี้และให้มันทำงานเป็นวงวนด้วย a, บอก, หน่วงเวลา 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 phantom PINGS จะถูกดำเนินการด้วยความล่าช้า 6000ms (เช่น: 6 วินาที) ระหว่างพวกเขาคุณสามารถเล่นกับค่าเหล่านี้เพื่อให้ได้ความล่าช้าที่คุณต้องการระหว่างแบตช์ไฟล์ลูป


เป็นความคิดที่ดี .. btw, C: \> ping 1.1.1.1 -n 10 -w 6000 ด้วยเหตุผลบางอย่างใช้เวลา 1 นาที 10 วินาทีบนคอมพิวเตอร์ของฉัน แต่ -n 1 -w 60000 ใช้เวลา 1 นาทีทุกประการ
barlop

@barlop - สิบสองคลาดเคลื่อนเกิดจากการเทียบกับ-n 10 -n 1

@ Randolph Potter ไม่ใช่ 10 ล็อตใน 6 วินาที 60 วินาทีใช่ไหม และ -n 10 ที่คุณใช้ควรมีความหมาย 10 ครั้ง
barlop

คุณอาจพูดถูก ฉันเอามันกลับมาและตำหนิผมบลอนด์ของฉัน

IF NOT EXIST C:\NO_SUCH_FILE_EVER.fooฉันสิ้นสุดการใช้วงนี้สำหรับการตรวจสอบชุด แฮ็ก แต่มันใช้งานได้ ขอบคุณสำหรับความคิด
Snekse

3

ขอบคุณทุกคำแนะนำ

ฉันลงเอยด้วยการเขียน VBScript ซึ่งมีพื้นฐานมาจากความคิดของ Linker3000 ในการสำรวจโฟลเดอร์และใช้ Task Scheduler เพื่อให้มันทำงานเมื่อเริ่มต้น ฉันได้รับไวยากรณ์พื้นฐานจากแหล่งข้อมูลนี้และปรับแต่งสิ่งที่จำเป็น

ฉันยังคงต้องการปรับให้เหมาะสมในบางจุดโดยใช้ความกล้าของสคริปต์ในระบบที่ขับเคลื่อนด้วยเหตุการณ์ แต่ฉันไม่มีเวลาพอที่จะทำงานกับมันและก็เป็นสิ่งที่ดีพอ

นี่คือสคริปต์ในกรณีที่ทุกคนมีความสนใจ (ด้วยส่วนการแปลงที่ไม่เกี่ยวข้องจะถูกทำขึ้นใหม่เพื่อความชัดเจน):

' 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

ไม่ทราบว่า robocopy ใช้ FileSystemWatcher หรือทำงานโดยการสำรวจความเปลี่ยนแปลง


1

หรือคุณอาจจะใช้นาฬิกา 4 โฟลเดอร์ เห็นได้ชัดว่ามันเป็นฟรีแวร์แบบพกพาและเข้ากันได้กับ Windows 7 ฉันไม่ได้ลอง แต่พบผ่านการค้นหาเว็บและคิดว่าฉันจะส่งต่อ

ฉันชอบสคริปต์ VBS ด้วยเช่นกันบนเว็บไซต์


น่าเสียดายที่รุ่นพกพาที่จ่ายเท่านั้น
nixda

กำลังคิดเกี่ยวกับการใช้ซอฟต์แวร์นี้ คุณจะเชื่อใจในการตรวจสอบการแชร์เครือข่ายกับไฟล์สำคัญจากผู้ใช้หลายคนหรือไม่?
Paul Matthews

Watch4Folder เวอร์ชันฟรีมีรายการ "ตัวอย่าง" เพียงรายการเดียวเท่านั้นที่สามารถกำหนดค่าได้
PeterCo


0

เราใช้เครื่องมือเชิงพาณิชย์ (เช่นไม่ฟรี) โพลโฟลเดอร์จากhttp://www.myassays.com/folder-pollเพื่อทำสิ่งนี้ เป็นแอพพลิเคชั่น Windows ที่มีแอพพลิเคชั่นจัดการที่ใช้งานง่ายเพื่อให้กำหนดค่าได้ง่าย นอกจากนี้ยังมีตัวเลือกการกำหนดค่า XML การสำรวจโฟลเดอร์จริงทำงานเป็นบริการ Windows (ดังนั้นจะเริ่มโดยอัตโนมัติในการรีสตาร์ทแต่ละครั้ง) เมื่อตรวจพบไฟล์ใหม่ในโฟลเดอร์แบบสำรวจคุณสามารถเปิดใช้แอปพลิเคชันได้โดยอัตโนมัติ (คุณสามารถระบุอาร์กิวเมนต์บรรทัดคำสั่งที่กำหนดเองของคุณเอง) มันสามารถทำสิ่งอื่น ๆ เช่นคัดลอก / ย้ายไฟล์ได้ นอกจากนี้กิจกรรมยังสามารถบันทึกลงในไฟล์บันทึกและมีการดำเนินการขั้นสูงอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.