Dateinamen sortieren und grösster Wert in eine Datei schreiben
Hallo,
ich möchte aus einem Verzeichnis alle Dateien mit import*.* sortieren und den grössten Wert ohne Dateiendung in eine Datei schreiben.
In dem Verzeichnis sind Beispielsweise folgende Dateien enthalten.
Bsp:
import01489.txt.gz
import01488.txt.gz
import01487.txt.gz
import01486.txt.gz
import01485.txt.gz
import01484.txt.gz
import01483.txt.gz
import01482.txt.gz
import01481.txt.gz
import01480.txt.gz
import01433.txt.gz
import01432.txt.gz.sav
import01432.txt.gz
import01431.txt.gz.sav
import01431.txt
mit
dir /B /O-N import*.* >>test.txt
bekomme ich zwar meine Liste nach Namen sortiert, lediglich benötige ich nur den grössten Eintrag ohne Dateiendung in einer Datei.
So sollte es nachher aussehen:
import01489
Für Eure hilfe bin ich sehr Dankbar.
ich möchte aus einem Verzeichnis alle Dateien mit import*.* sortieren und den grössten Wert ohne Dateiendung in eine Datei schreiben.
In dem Verzeichnis sind Beispielsweise folgende Dateien enthalten.
Bsp:
import01489.txt.gz
import01488.txt.gz
import01487.txt.gz
import01486.txt.gz
import01485.txt.gz
import01484.txt.gz
import01483.txt.gz
import01482.txt.gz
import01481.txt.gz
import01480.txt.gz
import01433.txt.gz
import01432.txt.gz.sav
import01432.txt.gz
import01431.txt.gz.sav
import01431.txt
mit
dir /B /O-N import*.* >>test.txt
bekomme ich zwar meine Liste nach Namen sortiert, lediglich benötige ich nur den grössten Eintrag ohne Dateiendung in einer Datei.
So sollte es nachher aussehen:
import01489
Für Eure hilfe bin ich sehr Dankbar.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 94803
Url: https://administrator.de/contentid/94803
Ausgedruckt am: 25.11.2024 um 13:11 Uhr
12 Kommentare
Neuester Kommentar
Hallo Lords82!
Da per Default das Leerzeichen und ein TAB als Trennzeichen gelten, muss beim ersten "for" - damit der gesamte Dateiname samt ev Leerzeichen (zwar lt Deinem Beispiel nicht aktuell, aber zur Vorsicht) - erfasst werden kann, das Trennzeichen explizit auf "Nichts" gesetzt werden - %%i enthält daher jeweils die gesamte Zeile (entspricht, wegen des "/b" beim "dir", nur dem Dateinamen).
Um nur den Teil vor dem ersten "." im Dateinamen zu erhalten, wird der Dateiname ("%%~ni" - siehe dazu ebenfalls "for /?") durch "delims=." aufgeteilt und, da keine Token-Nummer angegeben ist ("tokens=1" ist Default), der erste Teil ermittelt - letzterer steht als %%a zur Verfügung.
Dieser erste Teil wird schließlich der Variablen %v% zugewiesen, wobei diese bei jedem Schleifendurchlauf durch den aktuellen Wert überschrieben wird. Aufgrund der Sortierung wird die für Dich interessante Zeile als letzte aufgelistet, und daher enthält %v% nach der Schleife den Dateinamen mit der höchsten Nummer (zumindest, wenn die Stellenanzahl der Nummern immer konstant ist).
Um jetzt noch nur den Inhalt nach dem 6. Zeichen in die Ergebnisdatei zu schreiben, wird ein Teilstring (siehe "set /?") gebildet.
Alternativ könntest Du auch die Ersetzungsfunktion verwenden, um den Textbestandteil "import" (Groß-/Kleinschreibung egal) durch den Teil zwischen dem "=" und dem schließenden "%" (also Nichts ) zu ersetzen:
Grüße
bastla
Was ich eigentlich vergessen habe ist, das ich auch das import am Anfang nicht benötige
Ist nur eine Kleinigkeit, wenn die Zeichenanzahl (für "import" also 6) als Konstante eingetragen werden kann (oder der überflüssige Text bekannt ist - siehe dazu unten):FOR /F "delims=" %%i in ('dir /B /ON import*.*') do for /f "delims=." %%a in ("%%~ni") do set "v=%%a"
>>test.txt echo %v:~6%
Jedoch könntest Du uns ...
miniversum weiß das alles schon ... auch mal erklären wie das funktioniert
Mit "for /f" (siehe auch "for /?") kannst Du eine Datei oder (wie hier) die Ausgabe eines Befehles zeilenweise bearbeiten, wobei jede Zeile anhand eines Trennzeichens ("delimiters") in einzelne Teile ("tokens") zerlegt werden kann.Da per Default das Leerzeichen und ein TAB als Trennzeichen gelten, muss beim ersten "for" - damit der gesamte Dateiname samt ev Leerzeichen (zwar lt Deinem Beispiel nicht aktuell, aber zur Vorsicht) - erfasst werden kann, das Trennzeichen explizit auf "Nichts" gesetzt werden - %%i enthält daher jeweils die gesamte Zeile (entspricht, wegen des "/b" beim "dir", nur dem Dateinamen).
Um nur den Teil vor dem ersten "." im Dateinamen zu erhalten, wird der Dateiname ("%%~ni" - siehe dazu ebenfalls "for /?") durch "delims=." aufgeteilt und, da keine Token-Nummer angegeben ist ("tokens=1" ist Default), der erste Teil ermittelt - letzterer steht als %%a zur Verfügung.
Dieser erste Teil wird schließlich der Variablen %v% zugewiesen, wobei diese bei jedem Schleifendurchlauf durch den aktuellen Wert überschrieben wird. Aufgrund der Sortierung wird die für Dich interessante Zeile als letzte aufgelistet, und daher enthält %v% nach der Schleife den Dateinamen mit der höchsten Nummer (zumindest, wenn die Stellenanzahl der Nummern immer konstant ist).
Um jetzt noch nur den Inhalt nach dem 6. Zeichen in die Ergebnisdatei zu schreiben, wird ein Teilstring (siehe "set /?") gebildet.
Alternativ könntest Du auch die Ersetzungsfunktion verwenden, um den Textbestandteil "import" (Groß-/Kleinschreibung egal) durch den Teil zwischen dem "=" und dem schließenden "%" (also Nichts ) zu ersetzen:
>>test.txt echo %v:import=%
bastla