Problem bei der Verwendung von RENAME zum Hinzufügen eines Präfixes zu einer Reihe von Dateien

Problem bei der Verwendung von RENAME zum Hinzufügen eines Präfixes zu einer Reihe von Dateien

Beim Versuch, mehrere hundert Bilder in einem Ordner umzubenennen (was eine Selbstverständlichkeit ist und auf das ich keinen Einfluss habe), ist mir das folgende Problem begegnet:

Alle Dateien haben die Struktur "Name{Leerzeichen}Suffix.JPG".
Bilder können also die gleicheName, unterscheiden sich aber in diesem Fall durch ihreSuffix. Z.B

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

oder

L081473 a.JPG  
L081473 b.JPG

Ziel ist es, allen Bildern mit gleichem Namen einen Zähler (als Präfix) hinzuzufügen.

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

[..]

16_L081473 a.JPG  
16_L081473 b.JPG

Der Zähler wird in einer „FOR /F“-Schleife berechnet, die festlegt, welche Namen identisch sind und daher das gleiche Präfix erhalten sollten.
Aber wenn ich versuche, das Zählerpräfix hinzuzufügen, indem ich den folgenden REN-Befehl anwende:

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

Ich gerate in Schwierigkeiten.
( %%h and !cnt! are variables of the "FOR /F" loop)

Dies ist die entsprechende Ausgabe:

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

Die beiden "L081473" Dateien ergeben sogar eineeinzelAusgabedatei (ohne Suffix)!

16_L081473.JPG

Zweifellos besteht eine Verbindung zu den Mechanismen, die dbenham in seinemausführlicher Beitrag zum REN(AME)-Kommando, aber ich kann es für den obigen Fall nicht herausfinden, da ich erwarten würde, dass die ursprünglichen Dateinamen abgeschnitten werden, anstatt dass dabei einige Zwischenzeichen verloren gehen. Vielleicht ist das Leerzeichen im ursprünglichen Dateinamen der Grund, obwohl ich diese Dateinamen im Befehl in Anführungszeichen gesetzt habe, RENum Leerzeichen zu berücksichtigen? Kann das jemand erklären?

Da RENdas gewünschte Ergebnis scheinbar nicht erreicht werden kann (oder doch?), stellt sich die Frage, wie ich das angestrebte Ergebnis mit einem einfachen Batch erreichen kann.

RENIch habe auch versucht, das Problem zu umgehen, indem ich COPYoder verwendet habe XCOPY, aber die Ergebnisse sind identisch. Diese Befehle scheinen dasselbe Schema anzuwenden – wie von dbenham sorgfältig vorgeschlagenim selben Beitrag(siehe Hinweis).


Batch-Datei

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
)

Notiz:Ich habe die Batchdatei von ihrer zusätzlichen Logik befreit, die unter anderem verhindert, dass eine Datei mehr als einmal umbenannt wird. Die Datei „input.txt“ enthält alle Vorkommen von Namen (also ohne Suffix), was ausreicht, um das Präfix zu berechnen. Ich könnte eine Beispieldatei bereitstellen, habe aber nicht herausgefunden, wie ich sie mit dieser Nachricht verknüpfen kann. Außerdem könnte man die Umbenennung damit nicht reproduzieren (außerdem ist der Ordner „Images“ ca. 480 MB groß).
Die vollständigen Dateinamen in diesem Ordner werden berücksichtigt, indem in das Unterverzeichnis „Images“ gewechselt wird, wo die Dateien auf die Umbenennung warten. ( RENfunktioniert nur im aktuellen Verzeichnis)

Antwort1

Sie haben die Bedeutung des folgenden Absatzes in meinem RENAME-Beitrag übersehen oder nicht erkannt:

Jeder Name kann in Komponenten aufgeteilt werden, die durch Folgendes getrennt sind: . Zeichen dürfen nur an das Ende jeder Komponente angehängt oder davon gelöscht werden.Es ist nicht möglich, Zeichen am Anfang oder in der Mitte einer Komponente zu löschen oder hinzuzufügen, während der Rest mit Platzhaltern erhalten bleibt.. Auswechslungen sind überall erlaubt.

Sie versuchen, dem Basisnamen Zeichen hinzuzufügen und den Basisnamen mit einem oder mehreren Platzhaltern beizubehalten. Gemäß meiner obigen Aussage ist dies nicht möglich. Sie müssen jede Datei einzeln umbenennen. Dies sollte nicht besonders schwierig sein. Ich gehe davon aus, dass Ihre andere Logik korrekt ist:

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
)

Beachten Sie, dass der Code fehlschlägt, wenn %%Fer enthält !, weil die verzögerte Erweiterung aktiviert ist. Das kann durch etwas mehr Code gelöst werden. Beginnen Sie besser mit deaktivierter verzögerter Erweiterung und aktivieren Sie sie dann vorübergehend nach Bedarf.

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

verwandte Informationen