lords82
Goto Top

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.

Content-Key: 94803

Url: https://administrator.de/contentid/94803

Printed on: April 20, 2024 at 02:04 o'clock

Member: SarekHL
SarekHL Aug 19, 2008 at 15:59:11 (UTC)
Goto Top
In welcher Sprache? In VB könnte ich so ein Programm schreiben ...
Member: Lords82
Lords82 Aug 19, 2008 at 16:41:58 (UTC)
Goto Top
Hallo, das ganze soll auf Basis von WinXP unter der Kommandozeile "cmd", ohne weitere Software funktionieren.

Danke
Member: SarekHL
SarekHL Aug 19, 2008 at 16:43:38 (UTC)
Goto Top
Sorry, dann kann ich leider nicht weiterhelfen ...
Member: miniversum
miniversum Aug 19, 2008 at 17:08:06 (UTC)
Goto Top
So sollte es in einer Batch gehen:
FOR /F "delims=" %%i in ('dir /B /ON import*.*') do set v=%%i
echo %v%>>test.txt

Und an der cmd so:
(FOR /F "delims=" %i in ('dir /B /ON *.*') do @set v=%i) & call echo %v%
Member: bastla
bastla Aug 19, 2008 at 17:56:25 (UTC)
Goto Top
... und um auch den Rest der Anforderung zu erfüllen, noch eine Ergänzung:
FOR /F "delims=" %%i in ('dir /B /ON import*.*') do for /f "delims=." %%a in ("%%~ni") do set "v=%%a"  
>>test.txt echo %v%
Grüße
bastla
Member: miniversum
miniversum Aug 19, 2008 at 18:14:47 (UTC)
Goto Top
Achhab ich überlesen.
Aber wäre dann nicht so einfacher?
FOR /F "delims=" %%i in ('dir /B /ON import*.*') do set v=%%~ni
echo %v%>>test.txt
bsw. so:
(FOR /F "delims=" %i in ('dir /B /ON *.*') do @set v=%~ni) & call echo %v%
Member: bastla
bastla Aug 19, 2008 at 18:16:40 (UTC)
Goto Top
@miniversum

Wenn es da nicht "import01432.txt.gz.sav" gäbe ...

Grüße
bastla
Member: miniversum
miniversum Aug 19, 2008 at 18:38:24 (UTC)
Goto Top
hmm.. aber die Endung soll doch weg?
"import01432.txt.gz.sav" wäre für mich ohne Endung "import01432.txt.gz"
Member: bastla
bastla Aug 19, 2008 at 18:41:24 (UTC)
Goto Top
... allerdings nicht, so wie ich das Beispiel von Lords82 verstehe:
import01489
war vorher "import01489.txt.gz".

Grüße
bastla
Member: Lords82
Lords82 Aug 20, 2008 at 13:26:59 (UTC)
Goto Top
Hi,

ich habe das mal getestet funktioniert prima.

@miniversum bastla hatte recht... trotzdem Danke!

Danke an der Stelle für die schnelle Antwort.

Was ich eigentlich vergessen habe ist, das ich auch das import am Anfang nicht benötige, eigentlich brauch ich nur die Zahl 01489, aber das ist nicht weiter schlimm.

Jedoch könntest Du uns auch mal erklären wie das funktioniert, denn dann könnte man den Aufbau auch mal entsprechend ändern und auf was anderes anwenden.
(Ich habe da auch schon eine Verwendung dafür)

LG
Member: bastla
bastla Aug 20, 2008 at 13:52:52 (UTC)
Goto Top
Hallo Lords82!

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 face-smile
... 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 face-wink) zu ersetzen:
>>test.txt echo %v:import=%
Grüße
bastla
Member: Lords82
Lords82 Aug 20, 2008 at 15:14:34 (UTC)
Goto Top
Super Toll erklärt face-smile

Ich hab das sofort verstanden und auch an meine Bedürfnisse angepasst.
Der Tip mit dem Teilstring (set /?) war gut, wie man auch gleich erkennen kann...

Hat auf anhieb geklappt!

meine Änderung...

Meine Variablen vorab...
set jahr=%date:~-2%
set monat=%date:~-7,2%
set tag=%date:~-10,2%
set Lager1=AEZ
set Lager2=LEZ
set Lager3=
set Lager4=NEU
set Lager5=EFM
FOR /F "delims=" %%i in ('dir /B /ON "E:\DASI\Kassendaten\%Lager1%\DASI bis %jahr%_%monat%_%tag%\savearea\sjou*.*"') do for /f "delims=_" %%a in ("%%~ni") do set "y=%%a"
FOR /F "delims=" %%i in ('dir /B /ON "E:\DASI\Kassendaten\%Lager1%\DASI bis %jahr%_%monat%_%tag%\import*.*"') do for /f "delims=." %%a in ("%%~ni") do set "v=%%a"
"E:\DASI\Kassendaten\%Lager1%\Datenstand.txt" echo %Lager1% %jahr%-%monat%-%tag% %v:import=% %y:~4%