2010-03-03 67 views
0

我目前的想法:我需要一个可以让我访问USB设备的模块。此外,我需要某种类型的deamon,它会通知我的脚本有任何传入的USB连接事件。然后我只是使用一些正则表达式来查找我想要复制的文件,然后执行复制,也许使用某个文件复制模块。使用Perl连接时,如何从USB设备自动将文件复制到硬盘中?

但是我用关键字“USB”搜索了CPAN,结果发现确实很少有相关的模块,而且看起来最有前景的称为Device :: USB的模块称它不支持Windows系统。我正在运行Windows XP SP3,顺便说一句。

我认为这种自动化应该不会太困难,用Perl。但我只是呆在那里。

任何想法?或任何其他建议?谢谢:)

UPDATE

事情并不像预期的那样容易。我相信我还有很多东西需要学习。但基于我现有的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

搜索“USB”的问题在于USB并没有从根本上与它有任何关系。您将从HAL(而不是USB)获得插入通知,并且您将通过文件系统而不是USB与文件交互。 – hobbs 2010-03-03 02:41:53

+0

@hobbs,谢谢你告诉我这些。 – Mike 2010-03-03 04:17:27

回答

0

如果有人(可能是像我这样喜欢在Windows上玩Perl的Perl学习者)应该偶然发现这篇文章,我希望他/她能够很好地解决我的问题的核心部分,这是很慷慨的由Cormon从Perlmonks提供,不会像我第一次看@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"; 
     } 
    } 
} 

所有学分转到可丽耐,我想使它成为CW。

1

最坏的情况是轮询您的卷寻找它(找每隔几秒钟连接的驱动器)。像Perl这样的东西在Perl中是相当困难的,除非你愿意把你的手挂在Windows事件系统中。

很明显,理想的情况是从C连接到Window的本地USB通知子系统。如果您的棒有CD-ROM仿真,您可以在其上放置一个自动运行脚本。我认为你最好坚持使用C,C++甚至是C#来处理这类事情。 Perl是Windows上的二等公民。

+3

令人惊叹的Win32 :: API可让您使用任何DLL。 http://search.cpan.org/dist/Win32-API/API.pm有了该模块并且了解了适当的Win32 Notfication API,没有什么大不了的。 – daotoad 2010-03-03 02:55:09

+2

另一种选择是Inline :: C。 http://search.cpan.org/dist/Inline/C/C.pod在这里,您可以将C API调用包装为可从其他Perl代码调用的子例程。 – daotoad 2010-03-03 02:58:01

+0

这些家伙是对的。如果你混合了一点C,这是完全可行的。 – pestilence669 2010-03-03 03:57:16