mikefield
Goto Top

Batch optimieren und Frage zur Sortierung

Hallo, habe mal noch eine Frage zu einer Batchdatei, ob man die noch mit "for /l" vereinfachen ist und wie ich die Ausgabe hinterher sortieren kann.
Die Batchdatei hat folgenden gekürzten Inhalt:
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%a in ('Dir /b /o:n *ann*.txt') do (  
    set Zeile=
    for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
    call :ProcessLine1 "!Zeile!"  

    set Zeile=
    for /f "usebackq skip=8 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
    call :ProcessLine3 !Zeile!

    set Zeile=
    for /f "usebackq skip=9 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
    call :ProcessLine3 !Zeile!
.
.
.   
    set Zeile=
    for /f "usebackq skip=19 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
    call :ProcessLine3 !Zeile!

    set Zeile=
    for /f "usebackq skip=20 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
    call :ProcessLine3 !Zeile!
)
goto :Sort

:ProcessLine1
for /f "tokens=1-3 delims=- " %%c in (%1) do set "Datum=%%e.%%d.%%c"  
goto :eof

:ProcessLine3
set "No=%~1"  
set "Loc=%~2"  
set "Tim=%~4"  
set "Num=%~6"  
set "No=%No:~0,-1%"  

:Write
>>"%Annc%" echo %No%	%Datum%	%Loc%	%Tim%	%Num%  
goto :eof

:Sort
Echo Sortiere nun die Datei %ANNC%
Echo.

sort "%Annc%" /o "%Annc%"  
goto :eof
Nun meine Fragen dazu:
1. Kann man anstatt der einzelnen Zeilen mit skip 8 - 20 eine "for /l" Schleife mit einbauen, die dieses übernimmt?
2. Die Datei wird am Ende noch sortiert. Der Wert von %No% ist 1: bis 12: wobei das : entfernt wird. Die Sortierung ist
aber unschön, da diese dann 1, 10, 11, 12, 2, 3 ... ausgibt, anstatt 1 -9 und dann 10 - 12. Per If Abfrage lässt sich das
ja ausbessern zumal es ja nur eine weitere Zeile ist:
if %No% LSS 10 set "No=0%No%"   
Aber gibt es noch eine Möglichkeit das über Sort zu beeinflussen?

mf

Content-ID: 109680

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

Ausgedruckt am: 26.11.2024 um 17:11 Uhr

miniversum
miniversum 22.02.2009 um 12:26:34 Uhr
Goto Top
Zu 1.
Ja das geht. Ersetze die Zeilen 7 bis 23 durch diese (ungetestet):
for /L %%z in (8,1,20) do (
set Zeile= 
for /f "usebackq skip=%%z delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"   
call :ProcessLine3 !Zeile!
)
zu 2.
Wüste nicht das das direkt über Sort geht.
Mikefield
Mikefield 22.02.2009 um 12:38:11 Uhr
Goto Top
Danke miniversum für die schnelle Hilfe, aber leider klappt das nicht so:
"%z delims="" ist syntaktisch an dieser Stelle nicht verarbeitbar.  
"-1" ist syntaktisch an dieser Stelle nicht verarbeitbar.  
wid als Fehlermeldung ausgegeben.

mf
bastla
bastla 22.02.2009 um 12:59:32 Uhr
Goto Top
Hallo Mikefield!

Versuch es mal so (dann brauchst Du noch nicht einmal "delayedExpansion"):
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%%a"') do if %%i geq 8 if %%i leq 20 call :ProcessLine3 %%j
Hinsichtlich der Sortierung: Da "sort" textorientiert arbeitet, wirst Du nicht um eine Hilfskonstruktion herumkommen ...

Grüße
bastla

[Edit] "echo" vor "call" entfernt [/Edit]
[Edit2] Anführungszeichen um %%j entfernt. [/Edit2]
miniversum
miniversum 22.02.2009 um 13:06:47 Uhr
Goto Top
Dann versuchs mal so:
for /L %%z in (8,1,20) do (
set Zeile= 
set "skiper=skip=%%z"  
for /f "usebackq !skiper! delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"   
call :ProcessLine3 !Zeile!
)
Mikefield
Mikefield 22.02.2009 um 13:13:49 Uhr
Goto Top
Hallo Bastla!

Funktioniert leider auch nicht so wie gewünscht:, es werden dann nur die Zeilen 8 - 12 auf dem Bildschirm angezeigt.
call :ProcessLine3 "  
"  
call :ProcessLine3 "   1: 01A05 AP  2760 64 43   N/A         16:  
"  
call :ProcessLine3 "   2: 03A05 AP  2670 64 25   N/A         17:  
"  
.
.
.
call :ProcessLine3 "  10: 01B05 AP  3744 64 40   N/A         25:  
"  
call :ProcessLine3 "  11:                                    26:  
"  
call :ProcessLine3 "  12:                                    27:  

Herzlichst
mf
bastla
bastla 22.02.2009 um 13:17:25 Uhr
Goto Top
Hallo Mikefield!

Sorry - hatte noch das "echo" von meinem Test drinnen ...
Ich korrigier's gleich oben.

Grüße
bastla
Mikefield
Mikefield 22.02.2009 um 13:24:14 Uhr
Goto Top
Hallo Bastla!

Nun bekomme ich folgende Fehlermeldung:
"10" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

Herzlichst
mf

Nachtrag: Die 10 kommt vermutlich wohl von der 10:00 der Uhrzeit. wg. Delims=: Wenn ich den : hinter Delims wegnehme kommt die Fehlermeldung nicht mehr, allerdings wird auch nichts in die neue datei geschrieben. Anbei mal die Datei die abgefragt wird, sollte hierbei weiterhelfen.

2009-02-21  10:00 AM  -  Data Export

        Voice System name: Main - BOARDS      
                                                                                
      Brd       Tim     Num  Chk             Brd       Tim     Num  Chk         
      Loc   Sfx Rem  Rt Annc Sum             Loc   Sfx Rem  Rt Annc Sum         
                                                                                
   1: 01A05 AP  2760 64 43   N/A         16:                                    
   2: 03A05 AP  2670 64 25   N/A         17:                                    
   3: 02A05 AP  2546 64 22   N/A         18:                                    
   4: 03A06 AP  3133 64 52   N/A         19:                                    
   5: 04A05 AP  462  64 61   N/A         20:                                    
   6: 02B05 AP  2173 64 52   N/A         21:                                    
   7: 01A06 AP  1690 64 110  N/A         22:                                    
   8: 03B05 AP  4131 64 0    N/A         23:                                    
   9: 04B05 AP  3913 64 8    N/A         24:                                    
  10: 01B05 AP  3744 64 40   N/A         25:                                    
  11:                                    26:                                    
  12:                                    27:                                    
  13:                                    28:                                    
  14:                                    29:                                    
  15:                                    30:         
bastla
bastla 22.02.2009 um 14:40:45 Uhr
Goto Top
Hallo Mikefield!

Eigentlich sollte der Doppelpunkt kein Problem sein, da ja mit "tokens=1*" festgelegt wird, dass nur das erste Trennzeichen gelten soll (und somit die Tokens "1" und "Rest" entstehen).

Teste bitte nochmals nach einer weiteren Änderung meines Codes (auch oben vorgenommen): Für die Zerlegung im Unterprogramm ":ProcessLine3" - um die Parameter %1 bis %5 verwenden zu können - darf die Zeile bei der Übergabe nicht unter Anführungszeichen stehen (daher also nur %%j beim Aufruf "mitgeben").

Grüße
bastla
Mikefield
Mikefield 22.02.2009 um 16:13:13 Uhr
Goto Top
Hallo Bastla!

Habe Deine Änderung übernommen, bekomme aber weiterhin eine Fehlermeldung:
"-1" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

Was meinst Du mit der Änderung der ":Processline3"? Aus set "No=%~1" ein set No=%~1 machen? Oder bezog sich das auf "%%j"? Stehe jetzt auf dem Schlauch ...

Herzlichst
mf

Ann4.cmd:
@echo off & setlocal enabledelayedexpansion
:Integ_Annc
set "Annc=Announc.xls"  
Echo Erstelle nun die Datei %ANNC%
Echo.

Echo  Val		Brd	Time	Num > %Annc%
Echo  No	Datum	Loc	Rem	Annc >> %Annc%

for /f "delims=" %%a in ('Dir /b /o:n *ann*.txt') do (  
    set Zeile=
    for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
    call :ProcessLine1 "!Zeile!"  

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%%a"') do if %%i geq 8 if %%i leq 20 call :ProcessLine3 %%j  
)
goto :Sort

:ProcessLine1
for /f "tokens=1-3 delims=- " %%c in (%1) do set "Datum=%%e.%%d.%%c"  
goto :eof

:ProcessLine3
set "No=%~1"  
set "Loc=%~2"  
set "Tim=%~4"  
set "Num=%~6"  
set "No=%No:~0,-1%"  
if %No% LSS 10 set "No=0%No%"   

:Write
>>"%Annc%" echo %No%	%Datum%	%Loc%	%Tim%	%Num%  
goto :eof

:Sort
Echo Sortiere nun die Datei %ANNC%
Echo.

sort "%Annc%" /o "%Annc%"  
goto :eof
bastla
bastla 22.02.2009 um 16:42:09 Uhr
Goto Top
Hallo Mikefield!

Mit Deiner oben geposteten Beispieldatei kann ich den Fehler nicht nachvollziehen - könnte es sein, dass in einer anderen Datei zB ein "&" in den Daten vorkommt?

Abgesehen davon: Wenn ich das richtig interprtiere, wären eigentlich zwei Spalten (Werte für 1: bis 15: sowie 16: bis 30: ) zu verarbeiten - dann wäre es sinnvoller, die Zeile am Stück zu übergeben und dann in Spalten fixer Breite zu unterteilen, um damit die Variablen zu befüllen - ungetestet etwa:
@echo off & setlocal enabledelayedexpansion
:Integ_Annc
set "Annc=Announc.xls"  
Echo Erstelle nun die Datei %ANNC%
Echo.

Echo  Val		Brd	Time	Num > %Annc%
Echo  No	Datum	Loc	Rem	Annc >> %Annc%

for /f "delims=" %%a in ('Dir /b /o:n *ann*.txt') do (  
    set Zeile=
    for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
    call :ProcessLine1 "!Zeile!"  

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%%a"') do if %%i geq 8 if %%i leq 20 (set "Zeile=%%j" & call :ProcessLine3)  
)
goto :Sort

:ProcessLine1
for /f "tokens=1-3 delims=- " %%c in (%1) do set "Datum=%%e.%%d.%%c"  
goto :eof

:ProcessLine3
set "Spalte=%Zeile:~2,39%  
call :ProcessCol
set "Spalte=%Zeile:~41%  
call :ProcessCol
goto :eof

:ProcessCol
set /a No=%Spalte:~0,2%
set "Loc=%Spalte:~4,5%"  
REM Daten vorhanden? Falls nein, Verarbeitung hier beenden
if "%Loc%"=="     " goto :eof  
set "Tim=%Spalte:~14,4%"  
set /a Num=%Spalte:~22,4%
if %No% LSS 10 set "No=0%No%"   

:Write
>>"%Annc%" echo %No%	%Datum%	%Loc%	%Tim%	%Num%  
goto :eof

:Sort
Echo Sortiere nun die Datei %ANNC%
Echo.

sort "%Annc%" /o "%Annc%"  
goto :eof
Grüße
bastla

[Edit] Fehlende Prozentzeichen am Ende der Zeilen 31, 32, 35 und 36 nachgetragen. [/Edit]
Mikefield
Mikefield 22.02.2009 um 17:18:04 Uhr
Goto Top
Hallo Bastla!

Ich habe die entsprechenden Dateien in einen leeren Ordner separiert um andere Einflüsse zu vermeiden. Aber die gleiche Fehlermeldung.
Die Unterteilung in Spalten ist eine schöne Zugabe. Der Aufruf gibt aber einen "fehlender Operator" aus, läuft aber bis zum Ende durch.

mf
Mikefield
Mikefield 22.02.2009 um 17:22:15 Uhr
Goto Top
Hallo miniversum!

Zitat von @miniversum:
Dann versuchs mal so:

Der Umweg über Skipper hilft auch nicht, es bleibt dabei:
"!skiper! delims="" ist syntaktisch an dieser Stelle nicht verarbeitbar.  
"-1" ist syntaktisch an dieser Stelle nicht verarbeitbar.  

Herzlichst
mf
bastla
bastla 22.02.2009 um 17:29:34 Uhr
Goto Top
Hallo Mikefield!

Leider komme ich nur nebenbei dazu, deshalb heute viele ungetestete/fehlerhafte Versionen ... face-sad

Mit allen nötigen Prozentzeichen (fehlten jeweils am Ende) sollte der erste Teil des Unterprogrammes ":ProcessCol" so aussehen (und dann hoffentlich schön langsam auch funktionieren):
:ProcessCol
set /a No=%Spalte:~0,2%
set "Loc=%Spalte:~4,5%"  
REM Daten vorhanden? Falls nein, Verarbeitung hier beenden
if "%Loc%"=="     " goto :eof  
set "Tim=%Spalte:~14,4%"  
set /a Num=%Spalte:~22,4%
if %No% LSS 10 set "No=0%No%"  
Die Korrektur habe ich auch oben eingearbeitet.

Grüße
bastla
Mikefield
Mikefield 22.02.2009 um 17:46:09 Uhr
Goto Top
Hallo Bastla!

Cool, es funktioniert. es gibt zwar noch 8x einen "Fehlender Operand" (2x pro Datei), aber das Ergebnis stimmt erstmal!
Habe noch ein wenig geprüft, der fehler muß hier liegen. Kommentiere ich die Zeile aus, gibt es keine Fehlermeldung.
set /a No=%Spalte:~0,2%

Herzlichst
mf
bastla
bastla 22.02.2009 um 17:52:57 Uhr
Goto Top
Hallo Mikefield!

Der genannte Fehler kann eigentlich nur aus den Zeilen 31 oder 36 resultieren - wenn Du das "echo off" auf "echo on" änderst, kannst Du dem Ablauf "zuschauen" (es werden alle Befehle zuerst ausgegeben und erst danach ausgeführt) und so vielleicht dem Fehler auf die Spur kommen.

Bei Ausführung des Batches mit
Batchname >Batchlog.txt 2>&1
wird die gesamte Ausgabe (inkl der Fehlermeldungen auf Ausgabekanal 2) in die Datei "Batchlog.txt" geschrieben.
Alternativ kannst Du zur Kontrolle an den Anfang des Unterprogrammes ":ProcessCol" noch eine Zeile
echo #%Spalte%#
setzen - so wird der zu verarbeitende Text (mit den "#" als optischer Begrenzung) ausgegeben. Vielleicht stimmen ja die von mir festgelegten Spaltenpositionen (beim Erstellen der Varable %Spalte% oder auch in weiterer Folge beim Zerlegen von %Spalte%) nicht.

Grüße
bastla

[Edit] Den Hinweis auf die Fehlerzeile hatte ich vorher noch nicht gesehen ... [/Edit]
Mikefield
Mikefield 22.02.2009 um 18:05:06 Uhr
Goto Top
Hallo Bastla!

Bin schon ein wenig weiter gekommen.:
Lasse ich das /a weg kommt keine Fehlermeldung mehr! Allerdings macht er dann in der Zeile 08 ein 0 1, 0 2, usw daraus. Aber das bekomme ich auch noch weg.

Herzlichst
mf
bastla
bastla 22.02.2009 um 18:13:38 Uhr
Goto Top
Hallo Mikefield!

Dann ändere diese Zeile auf:
set "No=%No: =0%"
Grüße
bastla
Mikefield
Mikefield 22.02.2009 um 21:37:57 Uhr
Goto Top
Hallo Bastla!

Perfekt! Vielen Dank! Nun ist alles bestens!


Herzlichst
mf