[英]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.