フォルダー内の数百枚の画像の名前を変更しようとして、次の問題が発生しました (これは当然のことであり、影響を与えることはできません)。
すべてのファイルの構造は「名前{スペース}サフィックス.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が慎重に示唆したように、同じスキームを適用しているようです。COPY
XCOPY
同じ投稿で(注記を参照)。
バッチファイル
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"
)