我当前的想法:我需要一个能让我访问USB设备的模块。此外,我需要一些deamon的东西,将通知我的脚本任何传入的USB连接事件。然后我只是使用一些正则表达式找到我要复制的文件,然后进行复制,可能还有一些文件复制模块。
但我用关键字“USB”搜索CPAN只是为了发现确实很少有相关模块,看似最有前途的模块叫做Device :: USB说它不支持Windows系统。我正在运行Windows XP SP3,顺便说一句。
我认为Perl的这种自动化不应该太难。但我只是被困在那里。
有什么想法吗?或任何其他建议?谢谢:))
更新
事情并不像预期的那么容易。我相信我还有很多东西需要学习。但基于我现有的Perl知识,我已经设法编写了一个make-do脚本。我在这里学习。请注意我可以改进代码的地方。 总是如此谢谢:)
use warnings;
use strict;
use File::Find;
use File::Copy;
my $from = 'I:/'; #Volume letter for USB drive in my OS
my $to = 'E:\Copy-to';
while (1) {
if (-e $from) {
last;
}else{
sleep(30);
}
}
my @files;
find(sub{ push @files, $File::Find::name if /pdf$/}, $from); #Find the PDF files in the USB drive for Copying experiment
for (@files){
copy ($_,$to);
}
答案 0 :(得分:1)
最糟糕的情况是轮询您的卷以查找它(每隔几秒寻找附加的驱动器)。在Perl中,这样的事情相当困难,除非你愿意弄脏你的手。挂钩到Windows事件系统。
显然,理想情况是从C语言中连接到Window的本机USB通知子系统。如果您的操作系统有CD-ROM仿真,则可以在其上放置一个自动运行脚本。我认为你最好坚持使用C,C ++甚至C#这类事情。 Perl是Windows上的二等公民。
答案 1 :(得分:0)
如果有人(可能像我一样喜欢在Windows上玩Perl的Perl学习者)应该偶然发现这篇文章,我希望他/她能看到一个很好的解决方案来解决我的问题的核心部分,这是慷慨提供的来自Perlmonks的Corian并不会被误导,就像我第一次看@Pestilence(没有冒犯:))一样,相信Perl不能很好地处理有问题的任务。事实上,Perl完全有能力处理这类工作,并且非常容易实现。
以下代码是从Corian对我在Perlmonks发布的问题的回答中粘贴的(逐字)。来源是here
#!/usr/bin/perl -w
package main;
use strict;
use DBI;
use Data::Dumper;
my $dbh = DBI->connect('dbi:WMI:');
my $sth = $dbh->prepare(<<WQL);
SELECT * FROM __instanceoperationevent
WITHIN 5
WHERE TargetInstance ISA 'Win32_LogicalDisk'
and TargetInstance.Name != 'C:'
WQL
$sth->execute();
# loops forever
while (defined (my $row = $sth->fetchrow_arrayref())) {
my $ev = $row->[0];
# Windows XP only :(
print "Class\t",$ev->Path_->Class,"\n";
for (qw(Name DeviceID Caption MediaType InterfaceType)) {
print join "\t", $_, ($ev->TargetInstance->{$_} || '<none>');
print "\n";
if ($ev->Path_->Class eq '__InstanceCreationEvent') {
print "Device (letter) $ev->{TargetInstance}->{Name} added\n";
}
}
}
所有学分都归Corian所有,我想把它变成CW。