2017-01-23 2 views
0

Je suis en train d'exécuter une boucle for cmd qui ressemble à ceci:Comment définir et utiliser les variables de chaîne de nom de fichier dans la ligne de commande cmd?

for %f in (*.mp4) do (
    set outfile=%f:mp4=mp3% 
    ffmpeg -i %f -vn -ar 44100 -ac 1 -b:a 32k -f mp3 %outfile% 
) 

Le script est censé saisir tous les fichiers * .mp4, exécutez la commande ffmpeg sur eux, puis nommez le fichier résultant identique comme mp4 avec seulement l'extension changée en * .mp3.

Cela ne fonctionne pas. La sortie est littéralement nommée %outfile%. Si je devais deviner, il y a quelque chose de mal avec l'initialisation ou l'appel de la variable outfile. J'ai aussi pensé que c'est peut-être un problème de type de données. %f est peut-être un pointeur, pas une chaîne, donc une sorte d'extraction de chaîne ou de conversion de type est nécessaire.

Comment puis-je définir et utiliser un nom de fichier comme variable de chaîne dans cmd?

+0

Vous devez activer et utiliser [expansion différée] (http://ss64.com/nt/delayedexpansion.html) pour 'outfile' lorsque vous écrivez * et * lire cette variable dans un seul bloc de code; sinon, la variable est étendue à la valeur qu'elle contient lorsque le bloc entier est analysé; ou, encore plus facile, suivez [conseil de MCND] (http://stackoverflow.com/a/41813600) ci-dessous ... – aschipfl

Répondre

2

La meilleure façon de le faire est de ne pas le faire. Ne stockez pas dans une variable quelque chose qui peut être directement récupéré à partir du paramètre remplaçable for.

for %f in (*.mp4) do ffmpeg -i "%f" -vn -ar 44100 -ac 1 -b:a 32k -f mp3 "%~nf.mp3" 

Le paramètre remplaçable commande for (%f dans votre cas) permettent l'utilisation de certains modificateurs (voir for /?). %~nf est le nom, sans extension, du fichier référencé par %f

Mais, si votre seule option est de le faire, vous pouvez here trouver des façons de régler le problème.

+0

Oui, semble fonctionner. Donc c'était un problème de type de données? Si je changeais la dernière partie à '"% f.mp3 "', elle s'appellerait exactement 'filename.mp4.mp3'. Est-ce que '% f: mp4 = mp3%' ne devrait pas fonctionner si c'était la dernière ligne? – fredsbend

+0

@fredsbend pour les variables ne sont valides que dans la portée de l'instruction for (block). – LotPings

+0

@fredsbend, et la syntaxe de remplacement de la sous-chaîne ne peut pas être utilisée avec les références de variable 'for', elle est uniquement valable pour les variables d'environnement" normales "... – aschipfl