2017-09-06 8 views
0

私はいくつかのファイルをダウンロードし、名前を変更し、古いものを置き換えるためにコピーしたプロセスを簡略化するバッチコードを書いています。私は、ディレクトリからファイルのリストでFORループを読み込んだ後、ファイル名を変更しようとする問題が発生しています。forループ内の変数文字列の終了テキストを削除する方法

ファイル名にはすべて名前にFLYが含まれています.FLYの後にすべてのテキストを削除します。ファイル名の長さに一貫性がなく、複数のスペースがあり、トークン数が設定されていないため、トークンを使用できません。 FLYの後に文字数が設定されていないため、部分文字列を使用できません。

私はSS64での例を使って試してみましたが、ここで数多くのスレッドを読み込んでいますが、実際には私の状況に合致するものはありません。

ここでコードスニペットだ、感謝し、私は間違って行くよどこ誰かが私を伝えることができた場合:

SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /F "TOKENS=*" %%A IN ('DIR /B ^"%~DP0VFR^"') DO (
    SET FILENAME=%%A 
    SET REMOVETEXT=!FILENAME:*FLY=! 
    SET NEWFILENAME=!FILENAME:!REMOVETEXT!=! 
    ECHO !FILENAME! will be renamed !NEWFILENAME! 
) 

を私は何がすべてで起こって見にエコーを挿入すると何とか最後のSET、まで期待通りに動作します最後の結果は!NEWFILENAME!空白です。

答えて

0

寒い醸造の後、私はこのすべてが間違っていて、必要以上に複雑になっているかもしれません...私はワイルドカードでファイルの名前を直接変更しようと決めました。 FORループも必要ありませんでした。

REN "%~DP0VFR\*FLY*" *FLY 

に私が試した最初の(そして過度に複雑)ソリューションが動作しませんでしたが、これははるかに少ないコードでない理由はないアイデアを!

+0

Occam's Razorの完璧な例です。 – Squashman

0

Hmm。私の結果はあなたのものとは異なりました。

dir"はエスケープする必要はありません。

あなたsetステートメントを使用して問題は、それが

SET NEWFILENAME=!FILENAME:! + REMOVETEXT + !=! 

として解釈だとFILENAME:=ので、変数を既存されていないことであるあなたが主張するように、それぞれが空白、「REMOVETEXT」をもたらすでない置き換えられます。

溶液は、サブシェルで

SET NEWFILENAME=%FILENAME:current_value_of_REMOVETEXT=% 

として解決されnewname

call SET NEWFILENAME=%%FILENAME:!REMOVETEXT!=%% 

の二段階評価を使用することです。

+0

あなたは正しいです、私が2回目を見たとき、私は内容として "REMOVETEXT"を得ていました。 –

関連する問題