web-dev-qa-db-ja.com

複数のファイルをそれぞれの番号に名前変更(またはプレフィックスを削除)

現在のフォルダー内のすべてのファイル名を変更しようとしています。ファイルのプレフィックスを削除する(すべてのファイルに共通のプレフィックスが付いている)か、ファイル名をカウントに変更する(5つのファイルがある場合、ファイル名) 1.txt 2.txt 3.txt 4.txt 5.txt)になります。

今、私はcmdでrenコマンドを見つけて少し遊んでみましたが、これまでのところ、結果を得ることができず、cmdでしか実行できないため、バッチファイルを使用できません。

これは私が得た最も近いものですが、接頭辞を追加するだけです:

FOR %f IN (*.*) DO ren %f prefix%f

私は反対をやってみました:

FOR %f IN (*.*) DO ren prefix%f %f

しかし、もちろん、うまくいきませんでしたので、私は今、可能であれば助けといくつかの説明を求めています(これらのことがどのように機能するかを理解したい)。助けてくれてありがとう。

16
Shadow

バッチファイルを使用できない理由がわかりません。しかし、これはほとんどのファイル名で機能するソリューションです。

重要-まず、未定義の変数名があることを確認する必要があります。私はfnameを使用します

set "fname="

次は実際に名前を変更するコマンドです。 fnameがすでに定義されている場合は、正しく機能しません。

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%")

Fname変数は反復ごとに定義され、構文%fname:*prefix=%は、最初に出現する "prefix"を何も置き換えません。トリッキーなのは、コマンドが最初に解析されるときにWindowsが最初に%fname%を展開しようとすることです。もちろん、それはまだ定義されていないので機能しません。変数が見つからない場合、コマンドラインではパーセントが保持されます。 CALLにより、追加の拡張フェーズが発生しますafter変数が設定されているため、拡張が機能します。

コマンドを実行する前にfnameが定義されている場合、ループ内で割り当てられている値ではなく、反復ごとに同じファイルの名前を変更しようとします。

別のプレフィックスを使用してコマンドを再度実行する場合は、最初に定義を再度クリアする必要があります。

[〜#〜] edit [〜#〜]-ジョブを実行する「RemovePrefix.bat」という名前のバッチファイルを次に示します

::RemovePrefix.bat  prefix  fileMask
@echo off
setlocal
for %%A in ("%~1%~2") do (
  set "fname=%%~A"
  call ren "%%fname%%" "%%fname:*%~1=%%"
)

"prefixName.txt"のような名前のファイルがあるとすると、次のコマンドを実行してスクリプトを使用します。

RemovePrefix  "prefix"  "*.txt"

バッチファイルは、現在のディレクトリにあるファイルの名前を変更します。バッチファイルは、PATH変数内のディレクトリに存在しない限り、現在のディレクトリにも存在する必要があります。または、呼び出し時にバッチファイルへの完全パスを指定できます。

展開のルールは、バッチファイルでは異なります。 FOR変数は%Aではなく%% Aとして参照する必要があり、%% fname %%は最初は展開されず、代わりに二重パーセントが単一パーセントに変換され、CALLの後に%fname%が展開されます。 fnameがすでにバッチファイルで定義されているかどうかは関係ありません。 SETLOCALは、fnameの定義をバッチファイルに対して一時(ローカル)にします。

31
dbenham

より簡単なソリューションが提供されています
https://superuser.com/a/871799/497147

アクセスしやすいようにここにコピーしました。

このための複雑なスクリプトは忘れてください。

renameは非常に古く、適切に完了したコマンドではありません。それを適切に使用しない場合、結果はあなたを驚かせるかもしれません。

たとえば、abcd1.txtabcd2.txtabcd3.txt1.txtなどを取得するために、2.txt3.txtなどから接頭辞abcdを削除します。 SOMECODE] _単純に使用

rename "abcd*.txt" "////*.txt"

削除する最初の文字の数と同じ数の/が必要です。

両方の引数に二重引用符を配置してください。

35
Alnair