Dateien überprüfen und umbenennen
Aufgabe: Nachdem durch eine Batch aus verschiedenen Dateien im Ordner neue Dateien generiert wurden, soll zum Abschluss erst eine Überprüfung stattfinden, ob die neuen Dateien tatsächlich vorhanden sind (wenn nicht Fehlermeldung ausgeben) bevor die Orignaldateien verschoben werden. Außerdem soll in den neuen Dateien der Schluss des Dateinamens mit fixer Länge entfern werden.
Hallo zusammen!
Ich habe mal wieder ein Problem, bei dem ich auf eure Hilfe hoffe. In einem Ordner befinden sich verschiedene Dateien, deren Namen wie folgt aufgebaut sind:
Dateiname1 [20110506].txt
[rev] Dateiname2 [20110615].txt
Dateiname3 [20110905].txt
...
Aus diesen Dateien werden per Batchdatei ein paar der Inhalte in csv-Dateien zusammengefasst, die dann so benannt rauskommen:
Dateiname1 [20110506].csv
[rev] Dateiname2 [20110615].csv
Dateiname3 [20110905].csv
...
Wichtig ist, dass da mehr als nur eine eckige Klammer stehen kann, die einzelnen Teile jedoch immer durch ein Leerzeichen voneinander getrennt stehen. Jetzt möchte ich zum Abschluss dieser Batchdatei noch einfügen, dass er vor der Verschiebung der Original-Textdateien in einen anderen Ordner schaut, ob die neuen Dateien auch wirklich generiert wurden und außerdem hätte ich noch gern, dass in den Namen der csv dann das Datum in eckigen Klammern einschließlich dem vorangehenden Leerzeichen gelöscht wird.
Mein bisheriger Ansatz
funktioniert natürlich nicht...
1. Aus irgendeinem Grund verschiebt er die Originale nicht, auch wenn die dazugehörigen csv-Dateien vorhanden sind.
2. Der Ansatz über "blank[" zur richtigen eckigen Klammer, die gelöscht werden soll, zu kommen scheint mir nun doch nicht mehr richtig (auch habe ich das mit dem tokens noch immer nicht wirklich begriffen).
Ist es nicht irgendwie möglich, einfach die letzten 11 Zeichen (also Datum+Klammern+Leerzeichen vor der Klammer) eines Dateinamens zu löschen, ohne dass der gesamte Anfang des Dateinamens überprüft wird? (Externe Umbenennungsprogramme sind im übrigen keine Alternative, da es ja zum Abschluss einer Batch eingefügt werden soll und eben keine einmalige Sache ist).
Könnte mir bitte einer von euch Experten auf die Sprünge helfen?
Hallo zusammen!
Ich habe mal wieder ein Problem, bei dem ich auf eure Hilfe hoffe. In einem Ordner befinden sich verschiedene Dateien, deren Namen wie folgt aufgebaut sind:
Dateiname1 [20110506].txt
[rev] Dateiname2 [20110615].txt
Dateiname3 [20110905].txt
...
Aus diesen Dateien werden per Batchdatei ein paar der Inhalte in csv-Dateien zusammengefasst, die dann so benannt rauskommen:
Dateiname1 [20110506].csv
[rev] Dateiname2 [20110615].csv
Dateiname3 [20110905].csv
...
Wichtig ist, dass da mehr als nur eine eckige Klammer stehen kann, die einzelnen Teile jedoch immer durch ein Leerzeichen voneinander getrennt stehen. Jetzt möchte ich zum Abschluss dieser Batchdatei noch einfügen, dass er vor der Verschiebung der Original-Textdateien in einen anderen Ordner schaut, ob die neuen Dateien auch wirklich generiert wurden und außerdem hätte ich noch gern, dass in den Namen der csv dann das Datum in eckigen Klammern einschließlich dem vorangehenden Leerzeichen gelöscht wird.
Mein bisheriger Ansatz
@echo off & setlocal
for %%i in ("*.txt") IF EXIST "%%~ni.csv" DO move %%i originale\ ELSE goto :errormessage
REM Loesche letzten Teil des Dateinamens
FOR %%a in (* [*.csv) do (
FOR /f "delims= [ tokens=1,2" %%i in ("%%a") do rename "%a%b.csv" "%a.csv"
)
:errormessage
echo Die Dateien konnten nicht gefunden werden
set /p frage="Drücke eine beliebige Taste um abzubrechen."
if "%frage%" == "" goto end
:end
EXIT
funktioniert natürlich nicht...
1. Aus irgendeinem Grund verschiebt er die Originale nicht, auch wenn die dazugehörigen csv-Dateien vorhanden sind.
2. Der Ansatz über "blank[" zur richtigen eckigen Klammer, die gelöscht werden soll, zu kommen scheint mir nun doch nicht mehr richtig (auch habe ich das mit dem tokens noch immer nicht wirklich begriffen).
Ist es nicht irgendwie möglich, einfach die letzten 11 Zeichen (also Datum+Klammern+Leerzeichen vor der Klammer) eines Dateinamens zu löschen, ohne dass der gesamte Anfang des Dateinamens überprüft wird? (Externe Umbenennungsprogramme sind im übrigen keine Alternative, da es ja zum Abschluss einer Batch eingefügt werden soll und eben keine einmalige Sache ist).
Könnte mir bitte einer von euch Experten auf die Sprünge helfen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 174582
Url: https://administrator.de/contentid/174582
Ausgedruckt am: 19.12.2024 um 15:12 Uhr
19 Kommentare
Neuester Kommentar
Servus,
1) mit dem @echo off wirst du das niemals rausfinden.. WTF?
2) schau dir die Anleitung zur For Schleife an
Gruß
1) mit dem @echo off wirst du das niemals rausfinden.. WTF?
IF EXIST "%%~ni.csv" DO move %%i originale\ ELSE goto :errormessage
ist falsch- if else funktioniert so ohne klammern nicht
2) schau dir die Anleitung zur For Schleife an
- Schau dir auch mal Set /? an %PATH:~-10%
Gruß
if else funktioniert so ohne klammern nicht
... und das DO gehört zum FOR und daher davor ...Außerdem ist das Springen aus einer Schleife auch keine gute Idee (und das "Nicht-Zurückkehren-wenn-kein-Abbruch-gewünscht-wird" noch weniger) - vielleicht ließe sich ja (auf Basis eines Logs) im Nachhinein etwas entspannter auf die gefundenen Fehler (= nicht gefundenen Dateien ) reagieren ...
Grüße
bastla
Hallo Sodele,
ich habe nur mal kurz drüber geschaut. Grundsätzlich gilt: Alle Variablen/Ausdrücke, die Pfade/Dateinamen enthalten, immer in Anführungszeichen setzen (z.B.
Zu Deiner Idee, die letzten 11 Zeichen zu extrahieren: Schau dir mal
Gruß
Friemler
ich habe nur mal kurz drüber geschaut. Grundsätzlich gilt: Alle Variablen/Ausdrücke, die Pfade/Dateinamen enthalten, immer in Anführungszeichen setzen (z.B.
%%i
in Zeile 4, * [*.csv
in Zeile 7) und statt "delims= [ tokens=1,2"
das so "tokens=1,2 delims=[ "
schreiben.Zu Deiner Idee, die letzten 11 Zeichen zu extrahieren: Schau dir mal
set /?
an. Mit set "Var2=%Var1:~-11%"
kann genau das erreicht werden.Gruß
Friemler
@Friemler
(die sollen ja weg ) ...
Grüße
bastla
Zu Deiner Idee, die letzten 11 Zeichen zu extrahieren: Schau dir mal
... obwohl: Noch besser ginge das mitset /?
an. Mit set "Var2=%Var1:~-11%"
kann genau das erreicht werden.set "Var2=%Var1:~,-11%"
Grüße
bastla
Aloha,
... was glaubst du, bewirken %a & %b ?
greetz André
P.S.:
... hm also entweder machst du jetzt
daraus oder
weil so mit überflüssigen Leerzeichen sollte man sich beim Bätscheln gar nicht erst angewöhnen.
btw:
FOR %%a in (* [*.csv) do (
FOR /f "delims= [ tokens=1,2" %%i in ("%%a") do rename "%a%b.csv" "%a.csv"
greetz André
P.S.:
if "%frage%" == "" goto :eof
if "%frage%"=="" goto :eof
if "%frage%" equ "" goto :eof
btw:
set /p frage="Drücke eine beliebige Taste um abzubrechen."
und dann rattert es dennoch zu EXIT
? ... dann doch lieber STRG+C zum Abbrechen ... außerdem würde kaum jemand nichts drücken, ist doch eine Falle
[OT]
Moin Skye,
Man sollte auch weniger rauchen und öfters beichten gehen. Und den Müll trennen und nicht so laut Musik hören.
Allerdings gilt das mit den zu vermeidenden trailing and leading blanks beim SETzen von Variablen.
Da werden sowohl Leerzeichen vor wie nach dem Gleichheitszeichen mitgeSETzt.
-->Setzt eine Variable namens %TestLEERZEICHEN% auf den Wert LEERZEICHENwhatever
Beim IF-Vergleich allerdings werden Leerzeichen weggeparst.
Es würde jedenfalls nicht zu Fehlern im oben zitierten Code führen.
Grüße
Biber
[/OT]
Moin Skye,
Zitat von @Skyemugen:
P.S.:
... weil so mit überflüssigen Leerzeichen sollte man sich beim Bätscheln gar nicht erst angewöhnen.
Ja, stimmt schon.P.S.:
... weil so mit überflüssigen Leerzeichen sollte man sich beim Bätscheln gar nicht erst angewöhnen.
Man sollte auch weniger rauchen und öfters beichten gehen. Und den Müll trennen und nicht so laut Musik hören.
Allerdings gilt das mit den zu vermeidenden trailing and leading blanks beim SETzen von Variablen.
Da werden sowohl Leerzeichen vor wie nach dem Gleichheitszeichen mitgeSETzt.
Set test = whatever
Beim IF-Vergleich allerdings werden Leerzeichen weggeparst.
>set frage=xx
(=22:51:42 D:\temp=)
>if "%frage%" == "" @echo touchdown
(=22:52:05 D:\temp=)
>if "%frage%" == "xx" @echo touchdown
touchdown
(=22:52:15 D:\temp=)
>if "%frage%" == "xx" @echo touchdown
touchdown
(=22:52:30 D:\temp=)
>if %frage% == xx @echo touchdown
touchdown
(=22:52:54 D:\temp=)
>if %frage% ==xx @echo touchdown
touchdown
(=22:53:07 D:\temp=)
>if %frage% d ==xx @echo touchdown
"d" ist syntaktisch an dieser Stelle nicht verarbeitbar.
(=22:53:24 D:\temp=)
>if %frage% == xx @echo touchdown
touchdown
Es würde jedenfalls nicht zu Fehlern im oben zitierten Code führen.
Grüße
Biber
[/OT]
Hallo Sodele!
Zu beachten wäre dabei, dass Du entweder "delayedExpansion" (dann sollte es in Deinen Dateinamen kein "!" geben) oder ein Unterprogramm verwenden musst, um die "Umgebungsvariablen" in der Schleife nutzen zu können ...
Grüße
bastla
Wenn csv zu txt nicht existiert, dann gib eine Fehlermeldung aus und warte auf Abbruch durch Nutzer (damit er Zeit hat die Fehlermeldung zu sehen/lesen)
Dafür gäbe es doch "pause
" - aber wie oben schon erwähnt: Wäre es nicht sinnvoller, alle Dateien zu überprüfen und die Fehlenden in ein Log zu schreiben, anstatt schon bei der ersten nicht vorhandenen Datei den Batch abzubrechen?set setzt doch nur Umgebungsvariablen, aber kann doch nicht die richtigen Dateinamen umschreiben, oder doch?
Du kannst aber den neuen Dateinamen in einer Variablen erstellen und diese Variable beim "ren
" verwenden.Zu beachten wäre dabei, dass Du entweder "delayedExpansion" (dann sollte es in Deinen Dateinamen kein "!" geben) oder ein Unterprogramm verwenden musst, um die "Umgebungsvariablen" in der Schleife nutzen zu können ...
Grüße
bastla
[OT]
Aloha Biber,
I know, ich sagte auch nicht, dass das hier zu einem Fehler führen würde, sondern, dass man sich das gar nicht erst angewöhnen soll, denn sonst überträgt man das irgendwann nämlich wirklich auf das
@bastla, auch hier: I know aber ein Fehler bleibt ein Fehler und wir wollen hier ja keine halbe Arbeit machen
Anders ausgedrückt: Ich habe mich nicht weiter um die Fehlerbehebung des Themas bemüht, da ich Wiederkauen nicht mag, sondern habe lediglich noch nicht genannte, im Code enthaltene Fauxpas angekreidet.
greetz André
[/OT]
Aloha Biber,
I know, ich sagte auch nicht, dass das hier zu einem Fehler führen würde, sondern, dass man sich das gar nicht erst angewöhnen soll, denn sonst überträgt man das irgendwann nämlich wirklich auf das
set
zen von Variablen @bastla, auch hier: I know aber ein Fehler bleibt ein Fehler und wir wollen hier ja keine halbe Arbeit machen
Anders ausgedrückt: Ich habe mich nicht weiter um die Fehlerbehebung des Themas bemüht, da ich Wiederkauen nicht mag, sondern habe lediglich noch nicht genannte, im Code enthaltene Fauxpas angekreidet.
greetz André
[/OT]
Aloha,
weil du schreibst
frage ich mich: Warum das nicht alles in einem Abwasch geschieht und du das hier extra durchkaust?
Oder anders ausgedrückt, wenn davor schon etwas bätschelt, mach das Paket dann doch größer und steck' nicht zwei Kartons in dieselbe Schublade
greetz André
weil du schreibst
Aus diesen Dateien werden per Batchdatei ein paar der Inhalte in csv-Dateien zusammengefasst, die dann so benannt rauskommen:
frage ich mich: Warum das nicht alles in einem Abwasch geschieht und du das hier extra durchkaust?
Oder anders ausgedrückt, wenn davor schon etwas bätschelt, mach das Paket dann doch größer und steck' nicht zwei Kartons in dieselbe Schublade
greetz André
moin André,
ich schreibe es immer so, wie es der Interpreter hinschreiben würde: Ist für mich auch Lesbarer - schon beim Testen.
Andere Programmiersprachen haben ja auch "Luft" dazwischen.
Gruß Phil
... dass man sich das gar nicht erst angewöhnen soll, denn sonst ...
sieht man vllt etwas anderes...>for %i in (.) do if 1 == 1 echo gleich
>if 1 == 1 echo gleich
gleich
>for %i in (.) do if "1"=="1" echo gleich
>if "1" == "1" echo gleich
gleich
ich schreibe es immer so, wie es der Interpreter hinschreiben würde: Ist für mich auch Lesbarer - schon beim Testen.
Andere Programmiersprachen haben ja auch "Luft" dazwischen.
>for %i in (.) do if "1" == "1" echo gleich
>if "1" == "1" echo gleich
gleich
Gruß Phil
Aloha Phil
Ich war da konservativ, siehe Hilfe-Beispiele
da ich jedoch inzwischen dieses Doppelistgleich nicht mehr sehen kann, tendiere ich i.d.R. so oder so zu
greetz André
ich schreibe es immer so, wie es der Interpreter hinschreiben würde
verstehe, Sauerei! Ich war da konservativ, siehe Hilfe-Beispiele
Zeichenfolge1==Zeichenfolge2
IF %ERRORLEVEL% LEQ 1 goto ok
da ich jedoch inzwischen dieses Doppelistgleich nicht mehr sehen kann, tendiere ich i.d.R. so oder so zu
if "X" equ "X"
aber genug jetzt mit dem Offtopic zum if IF
contains space greetz André