Вопрос

Я использую Perl в Windows (Active 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"); 
    }

}

CHOLT возвращает массив имена файлов в моей текущей папке, эти имена файлов имеют пробелы между ними, поэтому элементы массива имеют пробелы между ними. Когда я использую систему (...), чтобы выполнить мою команду копирования на этих элементах массива, используя «$ _», как показано выше, он дает ошибку, как указано выше.

Я пробовал несколько способов, в которые я мог бы назвать системой (...), но без какого-либо успеха.

Я бы хотел знать,

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: "Мой длинный путь Это файл.mp3"

Редактировать:

Это не работает?

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

(Обратите внимание на двойные цитаты внутри строки не одинарных кавычек)

$ filename = ~ s / / /;

Что когда-либо имена файла просто использует Slash, чтобы преодолевать пробелы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top