2012-04-18 11 views
11

現在のフォルダ内のすべてのファイル名を変更しようとしていますが、ファイルプレフィックス(すべてのファイルに共通のプレフィックスが付いています)を削除するか、彼らの名前をカウントに変更する(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 

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

+0

これらのコマンドは、非常に大きなディレクトリではうまく動作しないようです。すでに接頭辞を追加したファイルに接頭辞を追加し続けます。 – hnviet

答えて

24

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

クリティカル - 最初にあなたは未定義の変数名を持っていることを確認しなければならない、私は次は実際には名前変更を行うためのコマンドであるfnameに

set "fname=" 

を使用します。 fnameがすでに定義されていると正しく動作しません。

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

FNAME変数は各反復のために定義され、その後、構文%fname:*prefix=%は何もない「接頭辞」の最初の発生を置き換えます。難しいのは、コマンドが最初に解析されたときにWindowsが%fname%を展開しようとする最初の試みです。もちろん、それはまだ定義されていないので動作しません。コマンドラインでは、変数が見つからないとパーセント値が保持されます。変数が設定されているため、の後にが発生する余分な拡張フェーズが発生するため、拡張が機能します。

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

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

EDIT - ここ

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

は、あなたが

RemovePrefix "prefix" "*.txt" 
を実行することで、スクリプトを使用し、あなたが"prefixName.txt"のような名前のファイルを持っていたと仮定し仕事をしていません「RemovePrefix.bat」という名前のバッチファイルがあります

バッチファイルは、現在のディレクトリ内のファイルの名前を変更します。バッチファイルは、PATH変数にあるディレクトリにバッチファイルが存在しないかぎり、現在のディレクトリになければなりません。また、バッチファイルを呼び出すときにバッチファイルのフルパスを指定することもできます。

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

+0

パーフェクト、追加の説明もありがとうございます! 編集:追加のリクエストと同じように、バッチファイルで作成することができる場合は、例を投稿できますか? – Shadow

+0

私はそれがどのように完璧だったのか分かりません。%fが%fname%の%fと混同される厄介なバグがありました。すべて修正済み:) – dbenham

+0

このスクリプトでは、現在のディレクトリのすべての子ディレクトリで '' .txt "'を検索し、指定された ''プレフィックス 'を削除するように変更する必要がありますか? – Kushal

23

Aはるかに簡単な解決策は、私は簡単にアクセスするためにここでそれをコピーし
https://superuser.com/a/871799/497147

で提供されています。

このための複雑なスクリプトは忘れてしまいます。

renameは非常に古く、決して適切に完了したコマンドではありません。正しく使用しないと、結果が驚くかもしれません。 1.txt2.txtを得るためになど、abcd1.txtからプレフィックスabcdを削除abcd2.txtabcd3.txtする例えば

3.txtは単にあなたが最初の文字の数として/の同じ番号が必要

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

を使用しますあなたは削除したいと思います。

両方の引数に二重引用符を使用します。

+0

今日の救い主。 –

+0

非常にクールで奇妙なテクニック。私は[Windows RENAMEコマンドでワイルドカードをどのように解釈するのですか?](https://superuser.com/q/475874/109090)この情報を持つスーパーユーザのQ&Aは、技術的には '/'が野生として機能していませんカード。 – dbenham

+0

信じられないほど単純で完璧に動作します。 "/"の数は、一致する式で指定された文字の数には関係しないことに注意してください。別の例: 'IM *。*" "////*.*"の名前を変更すると、2文字の接頭辞がマッチして4文字が削除されます – PaoloC

関連する問題