[英]How can I get a Windows batch or Perl script to run when a file is added to a directory?
我正在嘗試編寫一個腳本來解析本地文件並將其內容上傳到MySQL數據庫。 現在,我認為運行Perl腳本的批處理腳本可以工作,但我不確定這是否是實現此目的的最佳方法。
另外,我希望在將數據文件添加到某個目錄時立即運行此腳本。 這在Windows中可行嗎?
思考? 反饋? 我是Perl和Windows批處理腳本的新手,所以任何指導都會受到贊賞。
您可以使用Win32 :: ChangeNotify 。 將文件添加到目標目錄時,將通知您的腳本。
將一個使用FileSystemWatcher
類的小型C#應用程序放在一起來檢測添加到文件夾中的文件,然后生成所需的腳本並不難。 與定期輪詢文件夾相比,它肯定會使用更少的CPU /系統資源/硬盤帶寬。
可以使用WMI功能實現檢查新創建文件的文件夾。 也就是說,您可以創建一個Perl腳本,該腳本訂閱__InstanceCreationEvent
WMI事件,該事件跟蹤CIM_DirectoryContainsFile
類實例的創建。 一旦觸發了這種事件,您就知道文件夾中添加了一個新文件,可以根據需要對其進行處理。
這些文章提供了有關該主題的更多信息,並包含VBScript代碼示例(希望您將它們轉換為Perl並不困難):
你想要的功能是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 ...
}
}
您可以使用File::ChangeNotify
在Perl中輕松實現此目的。 該模塊可在CPAN上找到: http : //search.cpan.org/dist/File-ChangeNotify/lib/File/ChangeNotify.pm
您可以將代碼作為守護程序或服務運行,使其監視一個或多個目錄,然后在某些條件匹配時自動執行某些代碼(或啟動腳本)。
最重要的是,它是跨平台的,所以如果你想切換到Linux機器或Mac,它仍然可以工作。
你需要考慮什么是足夠的啟發式來確定“修改”。
按成本和准確度遞增順序:
文件大小(只要保持大小,文件內容仍然可以更改)
文件時間戳(如果你沒有運行ntpd時間不是單調的)
文件sha1sum(防彈但價格昂貴)
我將運行ntpd,然后遍歷時間戳,然后比較時間戳更改時的校驗和。 這可以在很短的時間內覆蓋很多地方。
這些方法不適用於計算機安全應用程序,它們用於理智系統上的文件管理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.