Windows 如何使用perl将文件从服务器移动到计算机

Windows 如何使用perl将文件从服务器移动到计算机,windows,perl,Windows,Perl,我想将Windows计算机连接的服务器上的文件移动到实际计算机上。我在我的mac电脑上尝试过这段代码,效果很好,因此我怀疑问题与我希望移动的文件在服务器上或Windows上有关(我不熟悉这个操作系统)。能够使用File::Find::Rule对我来说很重要,因为子目录中有许多子目录需要搜索 use strict; use warnings; use File::Find::Rule; use File::Copy; # directory where files live # my $dir

我想将Windows计算机连接的服务器上的文件移动到实际计算机上。我在我的mac电脑上尝试过这段代码,效果很好,因此我怀疑问题与我希望移动的文件在服务器上或Windows上有关(我不熟悉这个操作系统)。能够使用
File::Find::Rule
对我来说很重要,因为子目录中有许多子目录需要搜索

use strict;
use warnings;
use File::Find::Rule;
use File::Copy;

# directory where files live
# my $dir = "\\172.18\user\folder\folder2";

# directory where TextGrids will be moved to
my $outdir = "\users\lisa\desktop\test";

my @files;

@files = File::Find::Rule   -> file()
                             -> name("*_clean.TextGrid")
                             -> maxdepth()
                             -> in($dir);

foreach my $file (@files) {
    $file =~ /(.*\\)(.*)/;
    my $name = $2;
    copy("$file", "$outdir/$name") or die "Copy failed: $!";
    }
编辑:好的,我对下面的脚本做了一些更改。但奇怪的是,当我要求它打印每个文件时,它会给我类似于
\\172.18\user\folder\folder/255/file.txt
。我将regex改为
(.*\/)(.*)
,现在脚本工作得很好,尽管我不知道为什么

use strict;
use warnings;
use File::Find::Rule;
use File::Copy;

# directory where files live
my $dir = "\\\\172.18\\user\\folder\\folder2";

# directory where TextGrids will be moved to
my $outdir = "C:\\Users\\lisa\\desktop\\test";

my @files;

@files = File::Find::Rule   -> file()
                             -> name("*_clean.TextGrid")
                             -> maxdepth()
                             -> in($dir);

foreach my $file (@files) {
    print "$file\n";
    $file =~ /(.*\\)(.*)/;
    my $name = $2;
    copy("$file", "$outdir\\$name") or die "Copy failed: $!";
    }
输出

无法识别的转义\d在a.pl第7行传递。
\172.18Ser?较老?较老2
塞西萨德斯克托普酒店
你需要摆脱你的反斜杠

use strict;
use warnings;

my $dir = "\\\\172.18\\user\\folder\\folder2";
print("$dir\n");

my $outdir = "\\users\\lisa\\desktop\\test";
print("$outdir\n");

不要忽略警告。

编辑后,脚本工作,因为字符串中的最后一个目录分隔符恰好是
/
,它与正则表达式中的
\/
匹配。即使您在输入中有
\
,您用来查找添加的文件的库仍然是
/
s


我有一些建议:

  • 使用单引号字符串可以避免转义(大多数)反斜杠,除非需要插入双引号字符串

    转义反斜杠是可选的,除非后跟一个引号或另一个反斜杠:

    my $outdir = '\users\lisa\desktop\test';
    
    但是

    '有一个路径
    是该路径中的最后一个元素

  • <> >如果你在处理Windows,考虑使用<代码> [\/] < /COD>代替正则表达式中的目录分隔符。(如果绝对必须使用
    /
    作为正则表达式分隔符,则可以使用
    [\\\/]
    。)

    即使您可以控制用户输入,只在路径中使用
    \
    ,您使用的库通常也会添加
    /
    ,因此最好准备两者的组合

    $file =~ /(.*[\\\/])(.*)/;
    $file =~ m{(.*[\\/])(.*)};
    $file =~ m¤(.*[\\/])(.*)¤;
    

    我还删除了
    copy()
    调用中
    $file
    周围多余的引号。最终结果:

    use strict;
    use warnings;
    use File::Find::Rule;
    use File::Copy;
    
    # directory where files live
    my $dir = '\\172.18\user\folder\folder2';
    
    # directory where TextGrids will be moved to
    my $outdir = 'C:\Users\lisa\desktop\test';
    
    my @files;
    
    @files = File::Find::Rule   -> file()
                                -> name("*_clean.TextGrid")
                                -> maxdepth()
                                -> in($dir);
    
    foreach my $file (@files) {
        print "$file\n";
        $file =~ /(.*[\\\/])(.*)/;
        my $name = $2;
        copy($file, "$outdir\\$name") or die "Copy failed: $!";
    }
    

    在设置
    $outdir
    以获得启发后,添加行
    print$outdir
    。然后熟悉Perl的引用规则以及“双引号”和“单引号”之间的区别。您已经启用了
    use warnings
    ,因此Perl应该在您运行此脚本时提醒您一个问题。除了极少数例外,win32 API现在接受
    /
    作为文件路径分隔符。另外,@bytepusher-以
    /
    或“\”开头的路径是相对于当前驱动器的,而不是相对于目录的(尽管您认为这并不总是可以接受的,但我怀疑这在这里是可以的。)这很公平。我已经有一段时间没有处理这个问题了Windows@kayleeFrye_onDeck,显然,DOS2.0是DOS的第一个支持目录的版本,所以我说“/”只在DOS2.0之后才被支持,这有点误导。更准确地说,DOS和Windows始终支持“/”!有些(显然,您过去可以将DOS配置为接受“-”而不是“/”作为命令行实用程序开关)
    $file =~ /(.*[\\\/])(.*)/;
    $file =~ m{(.*[\\/])(.*)};
    $file =~ m¤(.*[\\/])(.*)¤;
    
    use strict;
    use warnings;
    use File::Find::Rule;
    use File::Copy;
    
    # directory where files live
    my $dir = '\\172.18\user\folder\folder2';
    
    # directory where TextGrids will be moved to
    my $outdir = 'C:\Users\lisa\desktop\test';
    
    my @files;
    
    @files = File::Find::Rule   -> file()
                                -> name("*_clean.TextGrid")
                                -> maxdepth()
                                -> in($dir);
    
    foreach my $file (@files) {
        print "$file\n";
        $file =~ /(.*[\\\/])(.*)/;
        my $name = $2;
        copy($file, "$outdir\\$name") or die "Copy failed: $!";
    }