2009-09-17 55 views
4

我想寫一個腳本,將解析本地文件並將其內容上傳到MySQL數據庫。現在,我認爲運行Perl腳本的批處理腳本可以工作,但我不確定這是否是完成此操作的最佳方法。如何在將文件添加到目錄時運行Windows批處理腳本或Perl腳本?

另外,我想這個腳本在數據文件被添加到某個目錄時立即運行。這在Windows中可能嗎?

的思考?反饋?我對Perl和Windows批處理腳本相當陌生,所以任何指導都不勝感激。

+0

您的文件名是否遵循一種模式?他們是否有共同的字符串作爲他們的名字的一部分? – vpram86 2009-09-17 14:22:38

+0

是的,它看起來像是。文件名的第一部分在所有文件中是一致的,然後是日期和遞增數字(從1開始)。 – indiguy 2009-09-17 14:29:38

回答

9

您可以使用Win32::ChangeNotify。將文件添加到目標目錄時,您的腳本將被通知。

1

將一個小型C#應用程序放在一起並不難,因爲它使用FileSystemWatcher類來檢測添加到文件夾中的文件,然後生成所需的腳本。它肯定會比定期輪詢文件夾使用更少的CPU /系統資源/硬盤帶寬。

+0

如果需要腳本,PowerShell也可以使用.NET類,如FileSystemWatcher。這裏有一個博客條目:http://mow001.blogspot.com/2005/10/msh-directory-watcher-with-popup.html,它顯示瞭如何。 – 2009-09-17 15:09:14

1

檢查新建文件的文件夾可以使用WMI功能來實現。也就是說,您可以創建一個Perl腳本,訂閱__InstanceCreationEvent WMI事件,該事件跟蹤CIM_DirectoryContainsFile類實例的創建。一旦這種事件被解僱,你就知道一個新的文件已經被添加到文件夾中,並且可以根據你的需要進行處理。

這些文章提供關於這個問題的詳細信息,幷包含VBScript代碼示例(希望這不會是你很難將它們轉換成Perl):

1

你想要的功能是ReadDirectoryChangesW。快速搜索perl包裝會產生這個Win32::ReadDirectoryChanges模塊。

你的腳本將是這個樣子:

use Win32::ReadDirectoryChanges; 

$rdc = new Win32::ReadDirectoryChanges(path => $path, 
             subtree => 1, 
             filter => $filter); 

while(1) { 
    @results = $rdc->read_changes; 

    while (scalar @results) { 
     my ($action, $filename) = splice(@results, 0, 2); 
     ... run script ... 
    } 
} 
+0

我無法判斷read_changes調用是否阻塞...如果不是,不會添加短暫睡眠是個好主意嗎? – Powerlord 2009-09-17 15:23:50

+0

它應該阻塞,直到目錄發生變化。 – arolson101 2009-09-18 16:07:29

+1

你應該不把它稱爲模塊;它只是許多年前在Perlmonks上發佈的一個腳本,並補充道:「這個模塊是對網絡上發現的幾件事的修改,它更像是一個概念證明,而不是真正可以使用的東西。」 – MichielB 2011-03-10 17:37:22

1

您可以使用File::ChangeNotify在Perl中輕鬆實現此目的。此模塊可在CPAN上找到:http://search.cpan.org/dist/File-ChangeNotify/lib/File/ChangeNotify.pm

您可以將代碼作爲守護程序或服務運行,使其監視一個或多個目錄,然後自動執行某些代碼(或啓動腳本)火柴。

最重要的是,它是跨平臺的,所以如果你想切換到Linux機器或Mac,它仍然可以工作。

0

您需要考慮什麼是確定「修改」的充分啓發式。

在成本增加和準確性的順序:

  1. 文件大小

  2. 文件的時間戳(文件內容仍然可以只要尺寸保持改變)(如果您沒有運行NTPD時間不單調)

  3. 文件SHA1SUM(防彈但價格昂貴)

我會運行ntpd,然後遍歷時間戳,然後比較校驗和,如果時間戳發生變化。這可以在很短的時間內覆蓋很多地面。

這些方法不適用於計算機安全應用程序,它們用於理智系統上的文件管理。