Alphanumerische Ausgabe maskierter Dateien in FOR-Schleife
Eine FOR-Schleife soll alle passenden Dateien alphanumerisch sortiert ausgeben.
Die folgende Zeile ist schuld:
Die Dateinamen können ja nichts dafür, daß sie numerische Anteile enthalten.
Die FOR-Schleife gibt die Dateien in der folgenden Reihenfolge raus:
Benötigt wird aber eine alphanumerische Sortierung:
Die Dateinamen und die darin enthaltenen Zahlen sind unbekannt, so daß eine echte alphanumerische Sortierung erfolgen muß.
Geht das irgendwie oder muß ich an Microsoft schreiben?
Die folgende Zeile ist schuld:
FOR %%F in (*.ext) DO TYPE %%F>>%allfiles%
Die FOR-Schleife gibt die Dateien in der folgenden Reihenfolge raus:
file_1.extfile_10.extfile_11.extfile_12.extfile_13.extfile_14.extfile_15.extfile_16.extfile_17.extfile_18.extfile_19.extfile_2.extfile_20.extfile_21.extfile_22.extfile_3.extfile_4.extfile_5.extfile_6.extfile_7.extfile_8.extfile_9.ext
Benötigt wird aber eine alphanumerische Sortierung:
file_1.extfile_2.extfile_3.extfile_4.extfile_5.extfile_6.extfile_7.extfile_8.extfile_9.extfile_10.extfile_11.extfile_12.extfile_13.extfile_14.extfile_15.extfile_16.extfile_17.extfile_18.extfile_19.extfile_20.extfile_21.extfile_22.ext
Die Dateinamen und die darin enthaltenen Zahlen sind unbekannt, so daß eine echte alphanumerische Sortierung erfolgen muß.
Geht das irgendwie oder muß ich an Microsoft schreiben?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 128414
Url: https://administrator.de/forum/alphanumerische-ausgabe-maskierter-dateien-in-for-schleife-128414.html
Ausgedruckt am: 09.04.2025 um 03:04 Uhr
11 Kommentare
Neuester Kommentar
Ebenfalls ohne Begrüßung.
Die Sortierung ist alphanumerisch. Was du willst ist: Handelt es sich um einen Text-Teilstring des Dateinamens, dann behandle ihn alphanumerisch, ansonsten numerisch. Die Datei kann nix für ihren numerischen Namensanteil, aber der Programmierer der statt 01 nur 1 verwendet.
Nochmal ohne Gruß.
Die Sortierung ist alphanumerisch. Was du willst ist: Handelt es sich um einen Text-Teilstring des Dateinamens, dann behandle ihn alphanumerisch, ansonsten numerisch. Die Datei kann nix für ihren numerischen Namensanteil, aber der Programmierer der statt 01 nur 1 verwendet.
Nochmal ohne Gruß.
Auch ohne Begrüßung.
Die Sortierung ist alphanumerisch.
Wenn du dich als Programmierer fühlst, solltest du die Anforderungen im Pflichtenheft gegebenfalls beim Auftraggeber in Frage stellen und nicht hier.
Wenn du unter dem CMD eine "logisch numerisch aufsteigende" Sortierung willst, dann muttu das selber machen.
Denn es existiert kein Gegenstück zu dem Explorer-Registrykey "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoStrCmpLogical" - der ist ein reines GUI-Schmankerl (siehe auch hier im Archiv ).
Workaround (Demo am CMD-Prompt)
Das mag ich, solche Beiträge am Montag Morgen.
Die Sortierung ist alphanumerisch.
Wenn du dich als Programmierer fühlst, solltest du die Anforderungen im Pflichtenheft gegebenfalls beim Auftraggeber in Frage stellen und nicht hier.
Wenn du unter dem CMD eine "logisch numerisch aufsteigende" Sortierung willst, dann muttu das selber machen.
Denn es existiert kein Gegenstück zu dem Explorer-Registrykey "HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoStrCmpLogical" - der ist ein reines GUI-Schmankerl (siehe auch hier im Archiv ).
Workaround (Demo am CMD-Prompt)
FOR /L %i in (1,1,111) DO IF Exist "D:\einpfad\file_%i.ext" TYPE "D:\einpfad\file_%i.ext">>%allfiles%
Das mag ich, solche Beiträge am Montag Morgen.
Zitat von @SG3105:
Der Auftraggeber meint:
"Um es mal mit einigen Beispielen zu sagen:
Bei Autos: Haudi H8, nicht 08 (Keine Werbung, da Herstellername und Typ geändert).
Bei Hausnummern: 13, nicht 013, Bei Straßenbahnen oder Buslinien: Linie 7, nicht Linie 07
Nur manche Geheimagenten nennen sich 007."
Der Auftraggeber meint:
"Um es mal mit einigen Beispielen zu sagen:
Bei Autos: Haudi H8, nicht 08 (Keine Werbung, da Herstellername und Typ geändert).
Bei Hausnummern: 13, nicht 013, Bei Straßenbahnen oder Buslinien: Linie 7, nicht Linie 07
Nur manche Geheimagenten nennen sich 007."
Na ja, mit der Aussage lässt sich ja schon etwas anfangen
Es fehlt das Leerzeichen hinter dem Link, besser so: Sortierung von Dateinamen mit Dezimalwerten in Windows Explorer
Jepp. Sorry für das fehlende Leerzeichen. Ist oben korrigiert.
FOR /L %i in (1,1,111) DO IF Exist "D:\einpfad\file_%i.ext" TYPE "D:\einpfad\file_%i.ext">>%allfiles%
Das löst leider nur einen Einzelfall.Bzw. du müsstest nicht in einem Forum nachfragen, sondern könntest bei Bertelsmann nachschlagen.
Demnach müßte wohl hier im Forum eine Option "derzeit nicht lösbar" hinzugefügt werden.
Ich finde es schon immer entgegenkommend von mir, wenn ich Beiträge als "temporär nicht löschbar" noch ein paar Stunden stehen lasse. Bitte nicht gleich wieder sauer werden.
Dito *gGeht sowas vielleicht mit anderen Onboard-Mitteln (vbs?)?
Sagen wir so... mit VBS sicherlich schneller als mit Batch -- FALLS das ein Kriterium ist.Wir können es doch aber so oder so nur mit einem (Batch- oder VBS- oder PERL oder Whatever-)Algorithmus einfangen, wenn wir diese Regeln verbal beschreiben können.
Wie Du es oben jetzt getan hast.
Wenn es keine Ausnahmen von der Regel gibt, dass alle Dateinamen, die Ziffern im Dateinamen enthalten "numerisch aufsteigend" statt "alphanumerisch" sortiert werden sollen?
Nochmal kompakt meine Rückfragen:
- gibt es Ausnahmen von der Sortierregel "numerisch aufsteigend"?
- wie ist denn der Umfang/die Häufigkeit, in der ihr dieses "Type-mir-alles-in-einen-Monstertext" macht? 20000 Dateien und das 3x täglich? Oder 15 Dateien einmal im Monat?
Ist das jetzt ironisch gemeint?
Keine Ahnung, was Ironik sein mag - ich bin da eher sachlich und nordisch-unterkühlt.Grüße.
Jepp.
Hallo zusammen!
Nachdem jetzt bereits Montagnachmittag ist und sich die Gemüter hoffentlich wieder beruhigt haben, hier ein VB-Script (*.vbs)
Das Script liest Dateinamen aus einem Verzeichnis ein und schreibt die Dateinamen numerisch sortiert in die Datei Sort.Txt
Bei diesem Script, wird angenommen, dass - wie im Beispiel - ein Delimiter ("_") vorhanden ist. Wenn nicht, muss der Code entsprechend angepasst werden.
Konstanten entsprechend anpassen:
Gruß Dieter
Nachdem jetzt bereits Montagnachmittag ist und sich die Gemüter hoffentlich wieder beruhigt haben, hier ein VB-Script (*.vbs)
Das Script liest Dateinamen aus einem Verzeichnis ein und schreibt die Dateinamen numerisch sortiert in die Datei Sort.Txt
Bei diesem Script, wird angenommen, dass - wie im Beispiel - ein Delimiter ("_") vorhanden ist. Wenn nicht, muss der Code entsprechend angepasst werden.
Konstanten entsprechend anpassen:
Const Ordner = "X:\Test" 'Verzeichnis
Const Ausgabe = "X:\Test\Sort.Txt" 'Numerisch sortierte Ausgabedatei
Const Delim = "_" 'Trennzeichen
Const Extension = ".ext" 'Dateierweiterung
Const adVarChar = 200 'Konstanten ADO-Recordset
Const adFldIsNullable = 32
Dim Fso, Rec, File, Text, SortName
'Main Beg
Set Fso = CreateObject("Scripting.FileSystemObject")
Call OpenRecordset
For Each File In Fso.GetFolder(Ordner).Files
If LCase(Right(File.Name, 4)) = LCase(Extension) Then
SortName = Right("00000" & Split(Fso.GetBaseName(File.Name), Delim)(1), 6)
Call WriteRecordset(File.Name, SortName)
End If
Next
Set File = Fso.CreateTextFile(Ausgabe)
With Rec
.Sort = "Alias"
.MoveFirst
Do Until .EOF
Text = .Fields(0)
File.WriteLine Text
.MoveNext
Loop
End With
Rec.Close: File.Close
'Main End
Private Sub OpenRecordset()
Set Rec = CreateObject("ADOR.Recordset")
With Rec.Fields
.Append "Name", adVarChar, 64, adFldIsNullable
.Append "Alias", adVarChar, 16, adFldIsNullable
Rec.Open
End With
End Sub
Private Sub WriteRecordset(ByRef File, ByRef Alias)
With Rec
.AddNew
.Fields("Name") = File
.Fields("Alias") = Alias
.Update
End With
End Sub
Gruß Dieter
Hallo SG3105,
hab selten solche Verrenkungen gemacht. Schau mal ob das zum Ergebnis führt:
Grüße
rubberman
hab selten solche Verrenkungen gemacht. Schau mal ob das zum Ergebnis führt:
@echo off &setlocal
set extension=ext
type nul>%temp%\temp.txt
set "num=1234567890"
for %%i in (*.%extension%) do set "datei=%%i" &set "name=%%~ni" &call :sub
sort %temp%\temp.txt /o %temp%\temp.txt
:: hier deine TYPE-Umleitung, statt ECHO
for /f "delims=; tokens=2" %%i in (%temp%\temp.txt) do echo "%%i"
del %temp%\temp.txt
pause
goto :eof
:sub
echo %name:~,1%|findstr "[0-9]">nul&&set "startnumeric=1"
set "text=%name%"
set "zahl=%name%"
set /a nt=1
:loop1
for /f "delims=%num% tokens=1*" %%a in ("%text%") do set "tpart%nt%=%%a" &set "text=%%b"
if not defined tpart%nt% goto weiter1
set /a nt+=1
if defined text goto loop1
:weiter1
set /a nt-=1
for /l %%n in (1,1,%nt%) do call set "alltext=%%alltext%%%%tpart%%n%%"
set /a nn=1
:loop2
for /f "delims=%alltext% tokens=1*" %%a in ("%zahl%") do set "npart%nn%=%%a" &set "zahl=%%b"
if not defined npart%nn% goto weiter2
set /a nn+=1
if defined zahl goto loop2
:weiter2
set /a nn-=1
for /l %%x in (1,1,%nn%) do (
call set npart%%x=0000000%%npart%%x%%
call set npart%%x=%%npart%%x:~-8%%
)
set /a nparts=nt+nn
set /a xt=0
set /a xn=0
set /a x=0
if not defined startnumeric goto loop3
set /a xn+=1
set /a x+=1
call set "string=%%npart%xn%%%"
:loop3
if %x%==%nparts% goto weiter3
set /a xt+=1
set /a x+=1
call set "string=%%string%%%%tpart%xt%%%"
if %x%==%nparts% goto weiter3
set /a xn+=1
set /a x+=1
call set "string=%%string%%%%npart%xn%%%"
goto loop3
:weiter3
set "string=%string% "
set "string=%string:~,100%;%datei%"
>>%temp%\temp.txt echo %string%
set "startnumeric="
set "alltext="
set "tpart1="
set "npart1="
set "string="
goto :eof
Grüße
rubberman

Hallo SG3105!

Gruß Dieter
Zitat von @SG3105:
Ergo kann ein Name und damit auch der Dateiname an jeder und an mehreren (min. zwei, besser drei) Stellen einen numerischen Anteil haben.
Gleich an mehreren Stellen numerischen Anteil? Nö danke, da weiß ich doch besseres mit meiner Zeit anzufangenErgo kann ein Name und damit auch der Dateiname an jeder und an mehreren (min. zwei, besser drei) Stellen einen numerischen Anteil haben.
Gruß Dieter