如何在将文件添加到目录时运行Windows批处理脚本或Perl脚本?
我想写一个脚本,将解析本地文件并将其内容上传到MySQL数据库。现在,我认为运行Perl脚本的批处理脚本可以工作,但我不确定这是否是完成此操作的最佳方法。如何在将文件添加到目录时运行Windows批处理脚本或Perl脚本?
另外,我想这个脚本在数据文件被添加到某个目录时立即运行。这在Windows中可能吗?
的思考?反馈?我对Perl和Windows批处理脚本相当陌生,所以任何指导都不胜感激。
将一个小型C#应用程序放在一起并不难,因为它使用FileSystemWatcher
类来检测添加到文件夹中的文件,然后生成所需的脚本。它肯定会比定期轮询文件夹使用更少的CPU /系统资源/硬盘带宽。
如果需要脚本,PowerShell也可以使用.NET类,如FileSystemWatcher。这里有一个博客条目:http://mow001.blogspot.com/2005/10/msh-directory-watcher-with-popup.html,它显示了如何。 – 2009-09-17 15:09:14
检查新建文件的文件夹可以使用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 ...
}
}
我无法判断read_changes调用是否阻塞...如果不是,不会添加短暂睡眠是个好主意吗? – Powerlord 2009-09-17 15:23:50
它应该阻塞,直到目录发生变化。 – arolson101 2009-09-18 16:07:29
你应该不把它称为模块;它只是许多年前在Perlmonks上发布的一个脚本,并补充道:“这个模块是对网络上发现的几件事的修改,它更像是一个概念证明,而不是真正可以使用的东西。” – MichielB 2011-03-10 17:37:22
您可以使用File::ChangeNotify
在Perl中轻松实现此目的。此模块可在CPAN上找到:http://search.cpan.org/dist/File-ChangeNotify/lib/File/ChangeNotify.pm
您可以将代码作为守护程序或服务运行,使其监视一个或多个目录,然后自动执行某些代码(或启动脚本)火柴。
最重要的是,它是跨平台的,所以如果你想切换到Linux机器或Mac,它仍然可以工作。
您需要考虑什么是确定“修改”的充分启发式。
在成本增加和准确性的顺序:
文件大小
文件的时间戳(文件内容仍然可以只要尺寸保持改变)(如果您没有运行NTPD时间不单调)
文件SHA1SUM(防弹但价格昂贵)
我会运行ntpd,然后遍历时间戳,然后比较校验和,如果时间戳发生变化。这可以在很短的时间内覆盖很多地面。
这些方法不适用于计算机安全应用程序,它们用于理智系统上的文件管理。
您的文件名是否遵循一种模式?他们是否有共同的字符串作为他们的名字的一部分? – vpram86 2009-09-17 14:22:38
是的,它看起来像是。文件名的第一部分在所有文件中是一致的,然后是日期和递增数字(从1开始)。 – indiguy 2009-09-17 14:29:38