2009-10-08 12 views
1

Ce qui suit est un script batch qui appelle mp3splt (un programme qui sépare les fichiers MP3 http://mp3splt.sourceforge.net/mp3splt_page/home.php) en partitions de 5 minutes.Problème de script de programme par lots avec des espaces avec des espaces

for /f %%a IN ('dir /b *.mp3') do call c:\PROGRA~1\mp3splt\mp3splt -t 5.0 -o output\@[email protected][email protected] %%a 

Il se casse lorsque les fichiers mp3 contiennent un espace. Quelqu'un peut-il proposer une solution de contournement?

Répondre

1

Vous pouvez citer la variable contenant le nom du fichier:

"%%a" 
+0

Ce n'est pas assez :-) – Joey

2
for %%a IN (*.mp3) do (
    call c:\PROGRA~1\mp3splt\mp3splt -t 5.0 -o output\@[email protected][email protected] "%%a" 
) 

Ce que les autres disent de citer ici la variable est sans doute correct. C'est nécessaire pour que cela fonctionne correctement. Mais ce n'est également que la moitié de la solution.

Votre problème ici est que dir /b crache des lignes de texte, chacun contenant un nom de fichier, comme ceci:

foo bar.mp3 
baz gak.mp3 
track01.mp3 
... 

for /f d'autre part est faite pour la lecture de fichiers ou autre chose (le dir sortie dans ce cas) ligne par ligne ... mais il fait également tokenizing. Cela signifie qu'il divise les chaînes à des endroits configurables en jetons individuels.

Par défaut,/F passe à la première découpe jeton séparé de chaque ligne de chaque fichier . Les lignes vides sont ignorées. Vous pouvez remplacer le comportement d'analyse par défaut en spécifiant le paramètre "options" facultatif. Ceci est une chaîne citée qui contient un ou plusieurs mots-clés pour spécifier différentes options d'analyse . - help for

Ainsi, vous obtenez uniquement la partie avant le premier espace du nom de fichier. Vous pouvez contourner ce problème en utilisant

for /f "delims=" in ... 

de préciser que tokenizing doit être fait sans délimiteurs, vous donnant essentiellement la ligne complète à chaque fois. Mais une meilleure façon est en fait celle que j'ai décrite au début pour simplement utiliser le for régulier pour itérer sur les fichiers. Pas de surprises avec des espaces dans les noms de fichiers et cela rend votre intention beaucoup plus claire.

Je suis régulièrement surpris de voir pourquoi les gens ont tendance à choisir une solution tortueuse et incorrecte sur une solution simple, claire et correcte.

+0

bonne réponse, ty! –

Questions connexes