Question

J'utilise Perl sur Windows (Active Perl). J'ai un programme Perl pour glob les fichiers dans le dossier en cours, et les concaténer tous à l'aide de dos copie commande appelée à l'intérieur du système en utilisant () ...

Quand j'exécute, ce qui donne une erreur de dos en disant « Le système ne peut pas trouver le fichier spécifié. » Il est lié aux espaces dans les noms de fichiers que j'ai.

Voici le code 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 retourne un tableau de noms de fichiers dans mon dossier en cours, ces noms de fichiers ont des espaces entre eux, de sorte que les éléments du tableau ont des espaces entre les deux. Quand j'utilise le système (...) pour exécuter ma commande de copie sur les éléments du tableau à l'aide de « $ _ » comme indiqué ci-dessus, il donne l'erreur comme ci-dessus.

J'ai essayé deux façons dont je pourrais appeler le système (...) mais sans succès.

Je voudrais savoir,

1] Comment puis-je obtenir ce travail sur les fichiers qui ont des espaces entre eux en utilisant le code ci-dessus. Comment « échapper » l'espace blanc dans les noms de fichiers.

2] Toute solution de rechange en Perl pour obtenir la même chose. (Simples bienvenus ..)

Était-ce utile?

La solution

Votre code n'ajoute pas de guillemets autour des noms de fichiers.

Essayez

"\"$_\""

et

"\"$outfile\""

Autres conseils

Arrêtez d'utiliser system() pour faire un appel qui peut être fait avec une bibliothèque portable. Perl a un fichier :: module de copie, utilisez-le et vous n'avez pas à vous soucier des choses comme ce plus vous obtenez bien meilleure portabilité des OS.

system est rarement la bonne réponse, use File::Copy;

Pour concaténer tous les fichiers:

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;

Des problèmes peuvent survenir lorsque vous essayez d'accéder à la $_ variable à l'intérieur d'un bloc interne. Le moyen le plus sûr, le changement:

foreach (@files)

à:

foreach $file (@files)

Ensuite, faites les changements nécessaires sur @args et échapper doublequotes de les inclure dans la chaîne ..

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

Dans les fenêtres, vous pouvez normalement des guillemets autour des noms de fichiers (et / ou des chemins) permettant les caractères spéciaux i.e. « noms de fichiers longs ».

C: \ "mon long chemin \ c'est un file.mp3"

Edit:

Est-ce que ce travail ne?

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

(NOTE guillemets doubles dans la chaîne non des guillemets simples)

$ filename = ~ s / \ / \ /;

Quel que soit le nom de fichier est juste utiliser slash à des espaces de référence

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top