使用Perl连接时,如何从USB设备自动将文件复制到硬盘?

时间:2010-03-03 02:37:41

标签: perl windows-xp usb

我当前的想法:我需要一个能让我访问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);
}

2 个答案:

答案 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。