我在Windows上使用Perl(活动Perl)。我有一个PERL程序可以将文件封闭到当前文件夹中,并使用从内部使用的DOS COPY命令将它们全部串联到使用System()...

当我执行时,这给出了一个DOS错误,说“系统找不到指定的文件”。它与我拥有的文件名中的空间有关。

这是Perl代码: -

@files = glob "*.mp3";
$outfile = 'final.mp3';
$firsttime = 1;
foreach (@files)
{

    if($firsttime == 1)
    {
       @args = ('copy' ,"/b ","$_","+","$outfile", "$outfile");
       system (@args);
       #system("copy /b '$_'+$outfile $outfile"); 
       $firsttime = 0;  
    }
    else
    {
       @args = ('copy' ,"/b ","$outfile","+","$_", "$outfile");
       system (@args);
       #system("copy /b $outfile+'$_' $outfile"); 
    }

}

Glob返回我当前文件夹中的文件名数组,这些文件名称之间的空格在其中,因此数组元素之间有空格。当我使用系统(...)使用“ $ _”在这些数组元素上执行我的复制命令时,如上所述,它会产生错误。

我尝试了几种可以调用系统(...)但没有成功的方式。

我想知道,

1]如何使用上面的代码对其之间的空间进行此操作。如何在文件名中“逃脱”空白。

2] PERL中的任何替代解决方案都可以实现相同的目标。 (欢迎简单的人..)

有帮助吗?

解决方案

您的代码不会在文件名周围添加任何引号。

尝试

"\"$_\""

"\"$outfile\""

其他提示

停止使用 system() 要使用便携式库可以完成呼叫。 Perl有一个 文件::复制 模块,使用它,您不必担心这样的事情,而且您的操作系统可移植性要好得多。

system 很少有正确的答案 use 文件::复制;

串联所有文件:

use File::Copy;
my @in = glob "*.mp3";
my $out = "final.mp3";

open my $outh, ">", $out;
for my $file (@in) {
    next if $file eq $out;
    copy($file, $outh);
}
close $outh;

当您尝试访问变量时,可能会出现问题 $_ 在内部块内。最安全的方式,更改:

foreach (@files)

到:

foreach $file (@files)

然后进行必要的更改 @args, ,并逃脱双重引用将它们包括在字符串中。

@args = ('copy' ,"/b ","\"$file\"","+","$outfile", "$outfile");
...
@args = ('copy' ,"/b ","$outfile","+","\"$file\"", "$outfile");

在Windows中,您通常可以在文件名(和/或路径)周围放置双引号,即允许特殊字符,即“长文件名”。

c:“我的长路径这是一个file.mp3”

编辑:

这不起作用吗?

system("copy /b \"$_\"+$outfile $outfile");

(请注意字符串中的双引号,而不是单报价)

$ filename = 〜s / / /;;

文件名只是使用斜杠来折叠空间

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top