2017-01-23 6 views
0

私はこのようになりますCMDでforループを実行しようとしている: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% 
) 

スクリプトは、すべて* .MP4ファイルをつかむことになっている、それらにffmpegのコマンドを実行し、その後、同じ結果ファイルに名前を付けます拡張子だけが* .mp3に変更されたmp4として。

動作しません。出力は、文字通り%outfile%と命名されています。私が推測しなければならないのは、outfile変数の初期化や呼び出しに何か問題があります。おそらくデータ型の問題だとも思っていました。 %fはおそらく文字列ではなくポインタなので、何らかの文字列抽出や型変換が必要です。

cmdで文字列変数としてファイル名を設定して使用するにはどうすればよいですか?

+0

この変数をコードの1つのブロックで記述しているので、 'outfile'に対して[delayed expansion](http://ss64.com/nt/delayedexpansion.html)を有効にして使用する必要があります。それ以外の場合、変数はブロック全体が解析されるときに保持される値に展開されます。以下の[MCNDのアドバイス](http://stackoverflow.com/a/41813600)に従ってください。 – aschipfl

答えて

2

これを行うには最良の方法はありません。置換可能なパラメータforから直接取得できる変数を格納しないでください。

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

forコマンド交換可能なパラメータ(あなたのケースで%fは)(for /?を参照)、いくつかの修飾子を使用することができます。 %~nfは、参照するファイルの名前で、拡張子なしです。%f

ただし、唯一の選択肢は、hereです。この問題に対処する方法がいくつかあります。

+0

はい、動作しているようです。それはデータ型の問題でしたか?最後の部分を ''%f.mp3 "'に変更した場合は、正確に 'filename.mp4.mp3'という名前になります。 '%f:mp4 = mp3%'も最後の行でなければならないのでしょうか? – fredsbend

+0

変数の@fredsbendは、for(block)ステートメントの有効範囲内でのみ有効です。 – LotPings

+0

@fredsbend、サブ文字列置換構文は 'for'変数参照と一緒に使うことはできません。通常の環境変数に対してのみ有効です。 – aschipfl

関連する問題