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:
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:
Aber gibt es noch eine Möglichkeit das über Sort zu beeinflussen?
mf
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
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%"
mf
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 109680
Url: https://administrator.de/contentid/109680
Ausgedruckt am: 26.11.2024 um 17:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo Mikefield!
Versuch es mal so (dann brauchst Du noch nicht einmal "delayedExpansion"):
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]
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
Grüße
bastla
[Edit] "echo" vor "call" entfernt [/Edit]
[Edit2] Anführungszeichen um %%j entfernt. [/Edit2]
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
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
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:
Grüße
bastla
[Edit] Fehlende Prozentzeichen am Ende der Zeilen 31, 32, 35 und 36 nachgetragen. [/Edit]
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
bastla
[Edit] Fehlende Prozentzeichen am Ende der Zeilen 31, 32, 35 und 36 nachgetragen. [/Edit]
Hallo Mikefield!
Leider komme ich nur nebenbei dazu, deshalb heute viele ungetestete/fehlerhafte Versionen ...
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):
Die Korrektur habe ich auch oben eingearbeitet.
Grüße
bastla
Leider komme ich nur nebenbei dazu, deshalb heute viele ungetestete/fehlerhafte Versionen ...
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%"
Grüße
bastla
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
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
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]
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
Alternativ kannst Du zur Kontrolle an den Anfang des Unterprogrammes ":ProcessCol" noch eine Zeile
echo #%Spalte%#
Grüße
bastla
[Edit] Den Hinweis auf die Fehlerzeile hatte ich vorher noch nicht gesehen ... [/Edit]