28

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

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

4

3 に答える 3

52

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

簡単にアクセスできるように、ここにコピーしました。

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

renameは非常に古く、適切に完了したことのないコマンドです。正しく使用しないと、驚くような結果になるかもしれません。

たとえば、、などabcdから接頭辞を削除して 、 を取得するには、単に使用しますabcd1.txtabcd2.txtabcd3.txt1.txt2.txt3.txt

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

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

両方の引数を二重引用符で囲んでください。

于 2015-09-14T09:37:41.190 に答える
41

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

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

set "fname="

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

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

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

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

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

編集-これは仕事をする「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の定義をバッチファイルに対して一時的(ローカル)にします。

于 2012-04-18T04:26:22.810 に答える