Domanda

Io uso Perl su Windows (Active Perl). Ho un programma perl per glob i file nella cartella corrente, e concatenare tutti utilizzando dos comando chiamato da copiare all'interno utilizzando il sistema () ...

Quando eseguo, questo dà un errore di dos dicendo "Il sistema non riesce a trovare il file specificato." E 'legato ai spazi nei nomi dei file che ho.

Questo è il codice 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 restituisce una matrice di nomi di file nella mia cartella corrente, Quei nomi di file hanno spazi tra loro, quindi gli elementi dell'array hanno spazi in mezzo. Quando uso il sistema di (...) per eseguire il mio comando di copia su quegli elementi di array utilizzando "$ _" come indicato sopra, dà l'errore come sopra.

Ho provato paio di modi in cui ho potuto chiamare il sistema (...), ma senza alcun successo.

Mi piacerebbe sapere,

1] Come posso ottenere questo lavoro sui file che hanno spazi tra di loro utilizzando il codice di cui sopra. Come 'fuga' lo spazio bianco nei nomi di file.

2] Qualsiasi soluzione alternativa in Perl per ottenere la stessa cosa. (Quelli semplici benvenuti ..)

È stato utile?

Soluzione

Il codice non aggiunge alcuna tra virgolette i nomi dei file.

Prova

"\"$_\""

e

"\"$outfile\""

Altri suggerimenti

Smettere di usare system() per effettuare una chiamata che può essere fatto con una libreria portabile. Perl ha un file il :: modulo Copy , l'uso che invece e non si deve preoccupare di cose come questo, più si ottiene molto meglio la portabilità del sistema operativo.

system raramente è la risposta giusta, use File::Copy;

Per concatenare tutti i file:

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;

problemi possono sorgere quando si sta cercando di accedere al $_ variabile all'interno di un blocco interno. Il modo più sicuro, il cambiamento:

foreach (@files)

a:

foreach $file (@files)

Poi fare le modifiche necessarie sui @args, e la fuga doublequotes includerli nella stringa ..

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

In Windows normalmente è possibile mettere i doppi apici intorno ai nomi dei file (e / o percorsi) che consente i caratteri speciali cioè "nomi di file lunghi".

C: \ "il mio lungo percorso \ questo è un file.mp3"

Modifica:

Ciò non lavoro?

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

(da notare le virgolette all'interno della stringa non apici)

$ nomefile = ~ s / \ / \ /;

che cosa mai il nome del file è sufficiente utilizzare barra di spazi di riferimento

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top