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

Alphanumerische Ausgabe maskierter Dateien in FOR-Schleife

Frage Entwicklung Batch & Shell

Mitglied: SG3105

SG3105 (Level 1) - Jetzt verbinden

01.11.2009, aktualisiert 18.10.2012, 5781 Aufrufe, 11 Kommentare

Eine FOR-Schleife soll alle passenden Dateien alphanumerisch sortiert ausgeben.

Die folgende Zeile ist schuld:
01.
FOR %%F in (*.ext) DO TYPE %%F>>%allfiles%
Die Dateinamen können ja nichts dafür, daß sie numerische Anteile enthalten.
Die FOR-Schleife gibt die Dateien in der folgenden Reihenfolge raus:

file_1.ext
file_10.ext
file_11.ext
file_12.ext
file_13.ext
file_14.ext
file_15.ext
file_16.ext
file_17.ext
file_18.ext
file_19.ext
file_2.ext
file_20.ext
file_21.ext
file_22.ext
file_3.ext
file_4.ext
file_5.ext
file_6.ext
file_7.ext
file_8.ext
file_9.ext

Benötigt wird aber eine alphanumerische Sortierung:

file_1.ext
file_2.ext
file_3.ext
file_4.ext
file_5.ext
file_6.ext
file_7.ext
file_8.ext
file_9.ext
file_10.ext
file_11.ext
file_12.ext
file_13.ext
file_14.ext
file_15.ext
file_16.ext
file_17.ext
file_18.ext
file_19.ext
file_20.ext
file_21.ext
file_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?
Mitglied: rubberman
01.11.2009 um 22:49 Uhr
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ß.
Bitte warten ..
Mitglied: SG3105
02.11.2009 um 09:07 Uhr
Danke für die Antwort.
Ich will hier nicht um Wortbezeichnungen streiten, mir geht es um eine Lösung des Problems.
Der Programmierer bin ich und ich muß mich an die Namesgebung halten und die ist nunmal nicht 0# oder 00# etc.
Viele Grüße an Alle, die mir weiterhelfen können.
Bitte warten ..
Mitglied: Biber
02.11.2009, aktualisiert 18.10.2012
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)
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.
Bitte warten ..
Mitglied: SG3105
02.11.2009, aktualisiert 18.10.2012
Zitat von Biber:
Wenn du dich als Programmierer fühlst, solltest du die
Anforderungen im Pflichtenheft gegebenfalls beim Auftraggeber in Frage
stellen und nicht hier.
Gut, dann muß ich mal mit mir reden:
...
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."

Wenn du unter dem CMD eine "logisch numerisch aufsteigende"
Sortierung willst, dann muttu das selber machen.
Logisch sind beide Sortierreihenfolgen.
Ich brauche aber nunmal die (von mir aus) "numerisch" richtige.

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
im Archiv
Es fehlt das Leerzeichen hinter dem Link, besser so:
http://www.administrator.de/forum/sortierung-von-dateinamen-mit-dezimal ...
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.
Demnach müßte wohl hier im Forum eine Option "derzeit nicht lösbar" hinzugefügt werden.
Bitte nicht gleich wieder sauer werden.

Geht sowas vielleicht mit anderen Onboard-Mitteln (vbs?)?
Ich kenn mich da nicht aus - sonst würde ich ja hier auch nicht soviel fragen.

Das mag ich, solche Beiträge am Montag Morgen.
Ist das jetzt ironisch gemeint?

Grüße.
Bitte warten ..
Mitglied: Biber
02.11.2009, aktualisiert 18.10.2012
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."

Na ja, mit der Aussage lässt sich ja schon etwas anfangen

Es fehlt das Leerzeichen hinter dem Link, besser so: http://www.administrator.de/forum/sortierung-von-dateinamen-mit-dezimal ...

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.
Sonst würde es ja auch nicht Individual-Programmierung heißen, sondern Pauschal-Programmierung.
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 *g
Geht 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.
Bitte warten ..
Mitglied: 76109
02.11.2009 um 15:24 Uhr
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:
01.
  
02.
Const Ordner = "X:\Test"			'Verzeichnis 
03.
Const Ausgabe = "X:\Test\Sort.Txt"		'Numerisch sortierte Ausgabedatei 
04.
 
05.
Const Delim = "_"				'Trennzeichen 
06.
Const Extension = ".ext"			'Dateierweiterung 
07.
 
08.
Const adVarChar = 200 			'Konstanten ADO-Recordset                  
09.
Const adFldIsNullable = 32 
10.
 
11.
Dim Fso, Rec, File, Text, SortName 
12.
 
13.
'Main Beg 
14.
     
15.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
16.
     
17.
    Call OpenRecordset 
18.
     
19.
    For Each File In Fso.GetFolder(Ordner).Files 
20.
        If LCase(Right(File.Name, 4)) = LCase(Extension) Then 
21.
            SortName = Right("00000" & Split(Fso.GetBaseName(File.Name), Delim)(1), 6) 
22.
            Call WriteRecordset(File.Name, SortName) 
23.
        End If 
24.
    Next 
25.
         
26.
    Set File = Fso.CreateTextFile(Ausgabe) 
27.
         
28.
    With Rec 
29.
        .Sort = "Alias" 
30.
        .MoveFirst 
31.
         Do Until .EOF 
32.
             Text = .Fields(0) 
33.
             File.WriteLine Text 
34.
            .MoveNext 
35.
         Loop 
36.
    End With 
37.
     
38.
    Rec.Close:  File.Close 
39.
 
40.
'Main End 
41.
 
42.
Private Sub OpenRecordset() 
43.
    Set Rec = CreateObject("ADOR.Recordset") 
44.
    With Rec.Fields 
45.
        .Append "Name", adVarChar, 64, adFldIsNullable 
46.
        .Append "Alias", adVarChar, 16, adFldIsNullable 
47.
         Rec.Open 
48.
    End With 
49.
End Sub 
50.
 
51.
Private Sub WriteRecordset(ByRef File, ByRef Alias) 
52.
    With Rec 
53.
        .AddNew 
54.
        .Fields("Name") = File 
55.
        .Fields("Alias") = Alias 
56.
        .Update 
57.
    End With 
58.
End Sub
Gruß Dieter
Bitte warten ..
Mitglied: SG3105
02.11.2009 um 17:14 Uhr
Ironik ist gut - gefällt mir.
Also bleiben wir sachlich fachlich, nur unterkühlt und regnerisch ist mir derzeit etwas unangenehm (Sauwetter).

Umfang/Häufigkeit:
Also mal etwas zum Hintergrund:
Ich habe gezählt (zählen lassen): Derzeit handelt es sich insgesamt um 8610 Dateien in diversen Unterverzeichnissen gegliedert. Jede Datei definiert ein Symbol, ein Gehäuse oder ein Bauteil (Symbol und Gehäuse-Verknüfung) als Bibliotheks-Element für ein Schaltplan und Layoutprogramm. Aus diesem sich ständig erweiternden Fundus werden über Batchdateien jeweils Bibliotheken in Textform erstellt, die dann von dem Programm eingelesen werden können. Dabei können einzelne Bibliotheks-Elemente in mehreren Bibliotheken vorkommen. Daraus resultiert auch ein wesentlicher Vorteil: Wird ein einziges Element geändert kann durch Suchen ermittelt werden welche Bibliotheken betroffen sind, die dann neu erstellt und eingelesen werden. Damit erhalte ich IMMER bibliotheksübergreifende Konsistenz!
Das Ganze muß also LANGLEBIG sein und wird durchschnittlich vielleicht 10 mal monatlich benötigt. Wenn's gebraucht wird eher so 30 mal am Stück innerhalb weniger Tage.
Geschwindigkeit ist kein wichtiges Kriterium.

gibt es Ausnahmen von der Sortierregel "numerisch aufsteigend"?
Wenn ich in die Zukunft blicken könnte...

Ausnahmen(?): Es gibt keine feste Dateinamensstruktur. Das Eingangsbeispiel war eben nur ein Beispiel.
Zum Verständnis: Generell gibt es keine Einschränkung bei der Namensvergabe. Diese legt ja der jeweilige Hersteller fest. Ergo kann ein Name und damit auch der Dateiname an jeder und an mehreren (min. zwei, besser drei) Stellen einen numerischen Anteil haben. Zusätzlich braucht man ein paar Sonderzeichen zur Trennung von Blöcken. Wie die Sonderzeichen einsortiert werden ist unerheblich, solange gleiche immer beieinander landen.
Folgende Zeichen im (Datei-)Namen habe ich bisher verwenden müssen: "a-zA-Z0-9µ,.+-_~!°"
Verbotene Zeichen: Leerzeichen und Semikolon, Hochkomma.
Alle für Dateinamen problematische Zeichen "*?/\" etc. kommen im Dateinamen nicht vor.

Ürigens spricht das Programm von "alphanumerisch sortiert" - daher mein "Sprachfehler".

Grüße.
Bitte warten ..
Mitglied: SG3105
02.11.2009 um 17:23 Uhr
Das war jetzt etwas zu schnell und zu sehr an obigem Beispiel orientiert.
Trotzdem Danke!

Das Trennzeichen ist leider so nicht vorhanden.
Genauere Infos zur Namensstruktur siehe oben.

Wie kann/muß ich das VBS aufrufen bzw. von der Batch starten?
Oben genannte FOR-Schleife raus und "Name.vbs" als Einzeiler rein?
Kann man Verzeichnis und Ausgabedatei als Parameter übergeben?

Gibt's eine Anleitung für VBS-DAUs wie mich?

Gruß.
Bitte warten ..
Mitglied: miniversum
02.11.2009 um 18:30 Uhr
Werden die Dateien den auch in der Reihnenfolge der Sortierungen erstellt?
Wenn ja warum dan nicht einfach so?:
dir /b /OD *.ext >%allfiles%
Bitte warten ..
Mitglied: rubberman
03.11.2009 um 02:11 Uhr
Hallo SG3105,

hab selten solche Verrenkungen gemacht. Schau mal ob das zum Ergebnis führt:
01.
@echo off &setlocal 
02.
 
03.
set extension=ext 
04.
 
05.
type nul>%temp%\temp.txt 
06.
set "num=1234567890" 
07.
for %%i in (*.%extension%) do set "datei=%%i" &set "name=%%~ni" &call :sub 
08.
sort %temp%\temp.txt /o %temp%\temp.txt 
09.
 
10.
:: hier deine TYPE-Umleitung, statt ECHO 
11.
for /f "delims=; tokens=2" %%i in (%temp%\temp.txt) do echo "%%i" 
12.
 
13.
del %temp%\temp.txt 
14.
pause 
15.
goto :eof 
16.
 
17.
 
18.
:sub 
19.
echo %name:~,1%|findstr "[0-9]">nul&&set "startnumeric=1" 
20.
set "text=%name%" 
21.
set "zahl=%name%" 
22.
set /a nt=1 
23.
:loop1 
24.
for /f "delims=%num% tokens=1*" %%a in ("%text%") do set "tpart%nt%=%%a" &set "text=%%b" 
25.
if not defined tpart%nt% goto weiter1 
26.
set /a nt+=1 
27.
if defined text goto loop1 
28.
:weiter1 
29.
set /a nt-=1 
30.
for /l %%n in (1,1,%nt%) do call set "alltext=%%alltext%%%%tpart%%n%%" 
31.
 
32.
set /a nn=1 
33.
:loop2 
34.
for /f "delims=%alltext% tokens=1*" %%a in ("%zahl%") do set "npart%nn%=%%a" &set "zahl=%%b" 
35.
if not defined npart%nn% goto weiter2 
36.
set /a nn+=1 
37.
if defined zahl goto loop2 
38.
:weiter2 
39.
set /a nn-=1 
40.
for /l %%x in (1,1,%nn%) do ( 
41.
  call set npart%%x=0000000%%npart%%x%% 
42.
  call set npart%%x=%%npart%%x:~-8%% 
43.
44.
set /a nparts=nt+nn 
45.
set /a xt=0 
46.
set /a xn=0 
47.
set /a x=0 
48.
if not defined startnumeric goto loop3 
49.
set /a xn+=1 
50.
set /a x+=1 
51.
call set "string=%%npart%xn%%%" 
52.
:loop3 
53.
if %x%==%nparts% goto weiter3 
54.
set /a xt+=1 
55.
set /a x+=1 
56.
call set "string=%%string%%%%tpart%xt%%%" 
57.
if %x%==%nparts% goto weiter3 
58.
set /a xn+=1 
59.
set /a x+=1 
60.
call set "string=%%string%%%%npart%xn%%%" 
61.
goto loop3 
62.
:weiter3 
63.
set "string=%string%                                                                                                   " 
64.
set "string=%string:~,100%;%datei%" 
65.
>>%temp%\temp.txt echo %string% 
66.
set "startnumeric=" 
67.
set "alltext=" 
68.
set "tpart1=" 
69.
set "npart1=" 
70.
set "string=" 
71.
goto :eof
Grüße
rubberman
Bitte warten ..
Mitglied: 76109
03.11.2009 um 09:43 Uhr
Hallo SG3105!

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 anzufangen

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (12)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...