49791
Jun 19, 2007, updated at 16:26:06 (UTC)
10026
6
0
Dateiname kürzen bzw. umbenennen auf erste Zeichenkette
Hallo,
ich erhalte Dateien in z.B. folgenden Formaten
15437_18_984_384few.txt
1458_156_hjt_ut76.txt
438456_e86_gf486_5.txt
nun soll mit einer Batch-Datei alles hinter nach dem ersten _ (inkl des Unterstrichs) gelöscht werden, ausser das .txt, bzw muss das sonst wieder rangesetzt werden.
So sollte es dann aussehen
15437.txt
1458.txt
438456.txt
In diesem Forum gab es einige ähnliche Progleme, aber ich habe daraus leider keinen Lösungsweg gefunden, Sorry.
Wäre nett wenn mir jemand helfen könnte, Danke
ich erhalte Dateien in z.B. folgenden Formaten
15437_18_984_384few.txt
1458_156_hjt_ut76.txt
438456_e86_gf486_5.txt
nun soll mit einer Batch-Datei alles hinter nach dem ersten _ (inkl des Unterstrichs) gelöscht werden, ausser das .txt, bzw muss das sonst wieder rangesetzt werden.
So sollte es dann aussehen
15437.txt
1458.txt
438456.txt
In diesem Forum gab es einige ähnliche Progleme, aber ich habe daraus leider keinen Lösungsweg gefunden, Sorry.
Wäre nett wenn mir jemand helfen könnte, Danke
Please also mark the comments that contributed to the solution of the article
Content-Key: 61790
Url: https://administrator.de/contentid/61790
Printed on: April 24, 2024 at 20:04 o'clock
6 Comments
Latest comment
Hallo donklotz und willkommen im Forum!
Das Problem beim Umbenennen ist eigentlich immer die Frage, was zu tun ist, wenn schon eine Datei gleichen Namens existiert.
Bis diese Frage beantwortet ist, ein Versuch, die grundsätzliche Vorgangsweise zu demonstrieren: Die folgende Zeile kannst Du direkt (und solange das "@echo" drinnen steht, auch gefahrlos) am Commandprompt eingeben:
Das angesprochene "@echo" bewirkt, dass der Vorgang nur angezeigt, aber nicht ausgeführt wird. Wenn Du das "@echo" entfernst, würden die Dateien tatsächlich umbenannt, ohne allerdings schon vorhandene Dateien zu überschreiben.
Grüße
bastla
[Edit] @miniversum: Immerhin Zweiter [/Edit]
Das Problem beim Umbenennen ist eigentlich immer die Frage, was zu tun ist, wenn schon eine Datei gleichen Namens existiert.
Bis diese Frage beantwortet ist, ein Versuch, die grundsätzliche Vorgangsweise zu demonstrieren: Die folgende Zeile kannst Du direkt (und solange das "@echo" drinnen steht, auch gefahrlos) am Commandprompt eingeben:
for %f in (*_*.txt) do @for /f "delims=_" %n in ('echo %f') do <b>@echo</b> ren %f %n%~xf
Grüße
bastla
[Edit] @miniversum: Immerhin Zweiter [/Edit]
Hallo donklotz!
Die Fehlermeldung koimmt daher, dass der Code für eine Direkteingabe am Prompt, nicht für eine Batchdatei geschrieben war - in Batch sind jeweils 2 Prozentzeichen erforderlich, wie in der folgenden neuen Version:
Zur Sicherheit habe ich auch noch Anführungszeichen eingesetzt, obwohl es anscheinend keine Leerstellen in den Dateinamen gibt. Da Du ohnehin in das entsprechende Verzeichnis wechselst, sind keine Pfade berücksichtigt.
Grüße
bastla
Die Fehlermeldung koimmt daher, dass der Code für eine Direkteingabe am Prompt, nicht für eine Batchdatei geschrieben war - in Batch sind jeweils 2 Prozentzeichen erforderlich, wie in der folgenden neuen Version:
for %%f in (*_*.txt) do @for /f "delims=_" %%n in ('echo %%~f') do @echo move /y "%%~f" "%%n%%~xf"
Grüße
bastla
Hallo donklotz!
Das erste "for" geht in einer Schleife alle dem Muster "*_*.txt" entsprechenden Dateien durch. Jede einzelne Datei steht dann unter der Variable %f zur Weiterbehandlung zur Verfügung. Ein
könnte dies demonstrieren, indem nur die entsprechenden Namen angezeigt werden. Von der Kommandozeile müsste wieder jeweils nur %f geschrieben werden.
Das zweite "for" dient der Zerlegung des mit "echo %~f" angezeigten Dateinamens ("~" entfernt umgebende Anführungszeichen und müsste hier nicht verwendet werden, schadet aber nicht) anhand des Trennzeichens ("delimiter") "_", wobei nur der davor stehende Teil als %n weitergegeben wird.
Da bereits vorhandene Dateien gleichen Namens überschrieben werden sollen, wird kein "ren" verwendet, sondern der Verschiebebefehl "move" leicht zweckentfremdet. Da dieser Befehl (ebenso wie "copy") neben dem eigentlichen Hauptzweck auch Umbenennen kann, ist er hier perfekt geeignet (zusammen mit dem Schalter "/y", der eine automatische "Zustimmung zum Überschreiben vorhandener Dateien" bedeutet). Eigentlich wird also die Ausgangsdatei aus dem aktuellen Ordner "ausgeschnitten" und unter einem neuen Namen wieder eingefügt.
Mit "%~f" wird der aus der ersten Schleife übernommene Dateiname auf eine Schreibweise mit umgebenden Anführungszeichen gesetzt (zunächst ev bereits vorhandene mit "~" vorsorglich entfernt und dann neue hinzugefügt) und als Quelle verwendet. Das Ziel wird aus "%n" (= Namensteil vor dem ersten "_") und der ursprünglichen Extension (also ".txt") zusammengesetzt. Dieser Bestandteil des Namens kann mit "%~xf" extrahiert werden, wobei eben das "x" von "Extension" abgeleitet ist. Näheres dazu findest Du in der Hilfe zu "for" (for /?).
Grüße
bastla
Auch wenn ich den Code nicht verstehe
Vielleicht kann ich dem ein wenig abhelfen:Das erste "for" geht in einer Schleife alle dem Muster "*_*.txt" entsprechenden Dateien durch. Jede einzelne Datei steht dann unter der Variable %f zur Weiterbehandlung zur Verfügung. Ein
for %%f in (*_*.txt) do @echo %%f
Das zweite "for" dient der Zerlegung des mit "echo %~f" angezeigten Dateinamens ("~" entfernt umgebende Anführungszeichen und müsste hier nicht verwendet werden, schadet aber nicht) anhand des Trennzeichens ("delimiter") "_", wobei nur der davor stehende Teil als %n weitergegeben wird.
Da bereits vorhandene Dateien gleichen Namens überschrieben werden sollen, wird kein "ren" verwendet, sondern der Verschiebebefehl "move" leicht zweckentfremdet. Da dieser Befehl (ebenso wie "copy") neben dem eigentlichen Hauptzweck auch Umbenennen kann, ist er hier perfekt geeignet (zusammen mit dem Schalter "/y", der eine automatische "Zustimmung zum Überschreiben vorhandener Dateien" bedeutet). Eigentlich wird also die Ausgangsdatei aus dem aktuellen Ordner "ausgeschnitten" und unter einem neuen Namen wieder eingefügt.
Mit "%~f" wird der aus der ersten Schleife übernommene Dateiname auf eine Schreibweise mit umgebenden Anführungszeichen gesetzt (zunächst ev bereits vorhandene mit "~" vorsorglich entfernt und dann neue hinzugefügt) und als Quelle verwendet. Das Ziel wird aus "%n" (= Namensteil vor dem ersten "_") und der ursprünglichen Extension (also ".txt") zusammengesetzt. Dieser Bestandteil des Namens kann mit "%~xf" extrahiert werden, wobei eben das "x" von "Extension" abgeleitet ist. Näheres dazu findest Du in der Hilfe zu "for" (for /?).
Grüße
bastla