RENAME を使用して多数のファイルにプレフィックスを追加するときに発生する問題

RENAME を使用して多数のファイルにプレフィックスを追加するときに発生する問題

フォルダー内の数百枚の画像の名前を変更しようとして、次の問題が発生しました (これは当然のことであり、影響を与えることはできません)。

すべてのファイルの構造は「名前{スペース}サフィックス.JPG
だから画像は同じ名前、しかしその場合、サフィックス例えば

L083192 (1).JPG  
L083192 (2).JPG  
L083192 (3).JPG  
L083192 (4).JPG

または

L081473 a.JPG  
L081473 b.JPG

目的は、同じ名前を持つすべての画像にカウンター(プレフィックスとして)を追加することです。つまり、

1_L083192 (1).JPG  
1_L083192 (2).JPG  
1_L083192 (3).JPG  
1_L083192 (4).JPG

[..]

16_L081473 a.JPG  
16_L081473 b.JPG

カウンターは「FOR /F」ループで計算され、どの名前が同一であるかを判定し、同じプレフィックスを取得するはずです。
しかし、次の REN コマンドを適用してカウンター プレフィックスを追加しようとすると、

ren "%%h*" "!cnt!_%%h*"

困ったことに遭遇しました。
%%h and !cnt! are variables of the "FOR /F" loop

対応する出力は次のとおりです。

L083192 (1).jpg >> 1_L0831921).jpg        [i.e. " (" gone missing]  
[..]  
L083192 (4).jpg >> 1_L0831924).jpg        [id.]

2つの「L081473」ファイルは、シングル出力ファイル(サフィックスなし)!

16_L081473.JPG

間違いなく、これはdbenhamが彼の論文で説明したメカニズムと関連している。REN(AME)コマンドに関する詳細な投稿しかし、上記のケースでは、中間文字がプロセス中に失われるのではなく、元のファイル名が切り捨てられると予想されるため、解決できません。RENスペースを収容するためにコマンドでこれらのファイル名を引用しましたが、元のファイル名のスペースが原因かもしれません。誰か説明できますか?

さらに、REN期待した結果を生成できないようですが(または生成できるのでしょうか?)、プレーン バッチを使用して目的の結果を取得するにはどうすればよいでしょうか。

またはRENを使用して問題を回避しようとしましたが、結果は同じでした。これらのコマンドは、dbenhamが慎重に示唆したように、同じスキームを適用しているようです。COPYXCOPY同じ投稿で(注記を参照)。


バッチファイル

FOR /F %%h IN (input.txt) DO (

    IF NOT "%%h" == "prev" (set /A cnt+=1)  

        [some more logic..]

    cd Images
    ren "%%h*" "!cnt!_%%h*"
    cd..

        [some more logic..]

    set prev=%%h
)

注記:バッチから追加ロジックを削除しました。これにより、ファイル名が複数回変更されることが回避されます。「input.txt」には、名前のみ (つまり、サフィックスなし) のすべての出現が含まれており、プレフィックスを計算するのに十分です。サンプル ファイルを提供することはできますが、このメッセージにリンクする方法が見つかりませんでした。また、名前の変更を再現することもできません (さらに、「Images」フォルダーは約 480 MB です)。
このフォルダー内の完全なファイル名は、ファイル名の変更を待機しているサブディレクトリ「Images」に変更することで考慮されます (REN現在のディレクトリでのみ機能します)

答え1

私の RENAME 投稿のこの段落の重要性を見逃したか、認識していませんでした:

名前は、 で区切られたコンポーネントに分割できます。文字は、. 各コンポーネントの末尾にのみ追加または削除できます。ワイルドカードを使用して、残りの部分を保持しながら、コンポーネントの先頭または途中から文字を削除したり追加したりすることはできません。どこでも代替が可能です。

ワイルドカードを使用してベース名を保持しながら、ベース名の先頭に文字を追加しようとしています。上記の説明のとおり、これは実行できません。各ファイルの名前を個別に変更する必要があります。これは特に難しいことではありません。他のロジックは正しいと想定しています。

FOR /F %%h IN (input.txt) DO (

    IF NOT "%%h" == "prev" (set /A cnt+=1)  

        [some more logic..]

    cd Images
    for %%F in ("%%h*") do ren "%%F" "!cnt!_%%F"
    cd..

        [some more logic..]

    set prev=%%h
)

%%F遅延拡張が有効になっているため、 contains が含まれている場合、コードは失敗することに注意してください!。これは、もう少しコードを追加することで解決できます。最初は遅延拡張を無効にして、必要に応じて一時的に有効にすることをお勧めします。

setlocal enableDelayedExpansion
for %%N in (!cnt!) do (
  endlocal
  for %%F in ("%%h*") do ren "%%F" "%%N_%%F"
)

関連情報