Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dateinamen sortieren und grösster Wert in eine Datei schreiben

Frage Entwicklung Batch & Shell

Mitglied: Lords82

Lords82 (Level 1) - Jetzt verbinden

19.08.2008, aktualisiert 20.08.2008, 6057 Aufrufe, 12 Kommentare

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.
Mitglied: SarekHL
19.08.2008 um 17:59 Uhr
In welcher Sprache? In VB könnte ich so ein Programm schreiben ...
Bitte warten ..
Mitglied: Lords82
19.08.2008 um 18:41 Uhr
Hallo, das ganze soll auf Basis von WinXP unter der Kommandozeile "cmd", ohne weitere Software funktionieren.

Danke
Bitte warten ..
Mitglied: SarekHL
19.08.2008 um 18:43 Uhr
Sorry, dann kann ich leider nicht weiterhelfen ...
Bitte warten ..
Mitglied: miniversum
19.08.2008 um 19:08 Uhr
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%
Bitte warten ..
Mitglied: bastla
19.08.2008 um 19:56 Uhr
... und um auch den Rest der Anforderung zu erfüllen, noch eine Ergänzung:
01.
FOR /F "delims=" %%i in ('dir /B /ON import*.*') do for /f "delims=." %%a in ("%%~ni") do set "v=%%a" 
02.
>>test.txt echo %v%
Grüße
bastla
Bitte warten ..
Mitglied: miniversum
19.08.2008 um 20:14 Uhr
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%
Bitte warten ..
Mitglied: bastla
19.08.2008 um 20:16 Uhr
@miniversum

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

Grüße
bastla
Bitte warten ..
Mitglied: miniversum
19.08.2008 um 20:38 Uhr
hmm.. aber die Endung soll doch weg?
"import01432.txt.gz.sav" wäre für mich ohne Endung "import01432.txt.gz"
Bitte warten ..
Mitglied: bastla
19.08.2008 um 20:41 Uhr
... allerdings nicht, so wie ich das Beispiel von Lords82 verstehe:
import01489
war vorher "import01489.txt.gz".

Grüße
bastla
Bitte warten ..
Mitglied: Lords82
20.08.2008 um 15:26 Uhr
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
Bitte warten ..
Mitglied: bastla
20.08.2008 um 15:52 Uhr
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):
01.
FOR /F "delims=" %%i in ('dir /B /ON import*.*') do for /f "delims=." %%a in ("%%~ni") do set "v=%%a" 
02.
>>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:
01.
>>test.txt echo %v:import=%
Grüße
bastla
Bitte warten ..
Mitglied: Lords82
20.08.2008 um 17:14 Uhr
Super Toll erklärt

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%
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

Batch & Shell
gelöst 2 große TXT Dateien vergleichen und Unterschiede in andere Datei schreiben (6)

Frage von sid.pdm zum Thema Batch & Shell ...

Windows Systemdateien
gelöst Registry-Schlüssel per Batch auslesen und in Datei schreiben (9)

Frage von Philzip zum Thema Windows Systemdateien ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (22)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...