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

Batch optimieren und Frage zur Sortierung

Frage Entwicklung Batch & Shell

Mitglied: Mikefield

Mikefield (Level 1) - Jetzt verbinden

22.02.2009, aktualisiert 11:55 Uhr, 4144 Aufrufe, 18 Kommentare

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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
for /f "delims=" %%a in ('Dir /b /o:n *ann*.txt') do ( 
03.
    set Zeile= 
04.
    for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
05.
    call :ProcessLine1 "!Zeile!" 
06.
 
07.
    set Zeile= 
08.
    for /f "usebackq skip=8 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
09.
    call :ProcessLine3 !Zeile! 
10.
 
11.
    set Zeile= 
12.
    for /f "usebackq skip=9 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
13.
    call :ProcessLine3 !Zeile! 
14.
15.
16.
.    
17.
    set Zeile= 
18.
    for /f "usebackq skip=19 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
19.
    call :ProcessLine3 !Zeile! 
20.
 
21.
    set Zeile= 
22.
    for /f "usebackq skip=20 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
23.
    call :ProcessLine3 !Zeile! 
24.
25.
goto :Sort 
26.
 
27.
:ProcessLine1 
28.
for /f "tokens=1-3 delims=- " %%c in (%1) do set "Datum=%%e.%%d.%%c" 
29.
goto :eof 
30.
 
31.
:ProcessLine3 
32.
set "No=%~1" 
33.
set "Loc=%~2" 
34.
set "Tim=%~4" 
35.
set "Num=%~6" 
36.
set "No=%No:~0,-1%" 
37.
 
38.
:Write 
39.
>>"%Annc%" echo %No%	%Datum%	%Loc%	%Tim%	%Num% 
40.
goto :eof 
41.
 
42.
:Sort 
43.
Echo Sortiere nun die Datei %ANNC% 
44.
Echo. 
45.
 
46.
sort "%Annc%" /o "%Annc%" 
47.
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:
01.
if %No% LSS 10 set "No=0%No%" 
Aber gibt es noch eine Möglichkeit das über Sort zu beeinflussen?

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

mf
Bitte warten ..
Mitglied: bastla
22.02.2009 um 12:59 Uhr
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]
Bitte warten ..
Mitglied: miniversum
22.02.2009 um 13:06 Uhr
Dann versuchs mal so:
01.
for /L %%z in (8,1,20) do ( 
02.
set Zeile=  
03.
set "skiper=skip=%%z" 
04.
for /f "usebackq !skiper! delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
05.
call :ProcessLine3 !Zeile! 
06.
)
Bitte warten ..
Mitglied: Mikefield
22.02.2009 um 13:13 Uhr
Hallo Bastla!

Funktioniert leider auch nicht so wie gewünscht:, es werden dann nur die Zeilen 8 - 12 auf dem Bildschirm angezeigt.
01.
call :ProcessLine3 " 
02.
03.
call :ProcessLine3 "   1: 01A05 AP  2760 64 43   N/A         16: 
04.
05.
call :ProcessLine3 "   2: 03A05 AP  2670 64 25   N/A         17: 
06.
07.
08.
09.
10.
call :ProcessLine3 "  10: 01B05 AP  3744 64 40   N/A         25: 
11.
12.
call :ProcessLine3 "  11:                                    26: 
13.
14.
call :ProcessLine3 "  12:                                    27:
Herzlichst
mf
Bitte warten ..
Mitglied: bastla
22.02.2009 um 13:17 Uhr
Hallo Mikefield!

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

Grüße
bastla
Bitte warten ..
Mitglied: Mikefield
22.02.2009 um 13:24 Uhr
Hallo Bastla!

Nun bekomme ich folgende Fehlermeldung:
01.
"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.

01.
2009-02-21  10:00 AM  -  Data Export 
02.
 
03.
        Voice System name: Main - BOARDS       
04.
                                                                                 
05.
      Brd       Tim     Num  Chk             Brd       Tim     Num  Chk          
06.
      Loc   Sfx Rem  Rt Annc Sum             Loc   Sfx Rem  Rt Annc Sum          
07.
                                                                                 
08.
   1: 01A05 AP  2760 64 43   N/A         16:                                     
09.
   2: 03A05 AP  2670 64 25   N/A         17:                                     
10.
   3: 02A05 AP  2546 64 22   N/A         18:                                     
11.
   4: 03A06 AP  3133 64 52   N/A         19:                                     
12.
   5: 04A05 AP  462  64 61   N/A         20:                                     
13.
   6: 02B05 AP  2173 64 52   N/A         21:                                     
14.
   7: 01A06 AP  1690 64 110  N/A         22:                                     
15.
   8: 03B05 AP  4131 64 0    N/A         23:                                     
16.
   9: 04B05 AP  3913 64 8    N/A         24:                                     
17.
  10: 01B05 AP  3744 64 40   N/A         25:                                     
18.
  11:                                    26:                                     
19.
  12:                                    27:                                     
20.
  13:                                    28:                                     
21.
  14:                                    29:                                     
22.
  15:                                    30:         
Bitte warten ..
Mitglied: bastla
22.02.2009 um 14:40 Uhr
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
Bitte warten ..
Mitglied: Mikefield
22.02.2009 um 16:13 Uhr
Hallo Bastla!

Habe Deine Änderung übernommen, bekomme aber weiterhin eine Fehlermeldung:
01.
"-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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
:Integ_Annc 
03.
set "Annc=Announc.xls" 
04.
Echo Erstelle nun die Datei %ANNC% 
05.
Echo. 
06.
 
07.
Echo  Val		Brd	Time	Num > %Annc% 
08.
Echo  No	Datum	Loc	Rem	Annc >> %Annc% 
09.
 
10.
for /f "delims=" %%a in ('Dir /b /o:n *ann*.txt') do ( 
11.
    set Zeile= 
12.
    for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
13.
    call :ProcessLine1 "!Zeile!" 
14.
 
15.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%%a"') do if %%i geq 8 if %%i leq 20 call :ProcessLine3 %%j 
16.
17.
goto :Sort 
18.
 
19.
:ProcessLine1 
20.
for /f "tokens=1-3 delims=- " %%c in (%1) do set "Datum=%%e.%%d.%%c" 
21.
goto :eof 
22.
 
23.
:ProcessLine3 
24.
set "No=%~1" 
25.
set "Loc=%~2" 
26.
set "Tim=%~4" 
27.
set "Num=%~6" 
28.
set "No=%No:~0,-1%" 
29.
if %No% LSS 10 set "No=0%No%"  
30.
 
31.
:Write 
32.
>>"%Annc%" echo %No%	%Datum%	%Loc%	%Tim%	%Num% 
33.
goto :eof 
34.
 
35.
:Sort 
36.
Echo Sortiere nun die Datei %ANNC% 
37.
Echo. 
38.
 
39.
sort "%Annc%" /o "%Annc%" 
40.
goto :eof
Bitte warten ..
Mitglied: bastla
22.02.2009 um 16:42 Uhr
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
:Integ_Annc 
03.
set "Annc=Announc.xls" 
04.
Echo Erstelle nun die Datei %ANNC% 
05.
Echo. 
06.
 
07.
Echo  Val		Brd	Time	Num > %Annc% 
08.
Echo  No	Datum	Loc	Rem	Annc >> %Annc% 
09.
 
10.
for /f "delims=" %%a in ('Dir /b /o:n *ann*.txt') do ( 
11.
    set Zeile= 
12.
    for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b" 
13.
    call :ProcessLine1 "!Zeile!" 
14.
 
15.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%%a"') do if %%i geq 8 if %%i leq 20 (set "Zeile=%%j" & call :ProcessLine3) 
16.
17.
goto :Sort 
18.
 
19.
:ProcessLine1 
20.
for /f "tokens=1-3 delims=- " %%c in (%1) do set "Datum=%%e.%%d.%%c" 
21.
goto :eof 
22.
 
23.
:ProcessLine3 
24.
set "Spalte=%Zeile:~2,39% 
25.
call :ProcessCol 
26.
set "Spalte=%Zeile:~41% 
27.
call :ProcessCol 
28.
goto :eof 
29.
 
30.
:ProcessCol 
31.
set /a No=%Spalte:~0,2% 
32.
set "Loc=%Spalte:~4,5%" 
33.
REM Daten vorhanden? Falls nein, Verarbeitung hier beenden 
34.
if "%Loc%"=="     " goto :eof 
35.
set "Tim=%Spalte:~14,4%" 
36.
set /a Num=%Spalte:~22,4% 
37.
if %No% LSS 10 set "No=0%No%"  
38.
 
39.
:Write 
40.
>>"%Annc%" echo %No%	%Datum%	%Loc%	%Tim%	%Num% 
41.
goto :eof 
42.
 
43.
:Sort 
44.
Echo Sortiere nun die Datei %ANNC% 
45.
Echo. 
46.
 
47.
sort "%Annc%" /o "%Annc%" 
48.
goto :eof
Grüße
bastla

[Edit] Fehlende Prozentzeichen am Ende der Zeilen 31, 32, 35 und 36 nachgetragen. [/Edit]
Bitte warten ..
Mitglied: Mikefield
22.02.2009 um 17:18 Uhr
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
Bitte warten ..
Mitglied: Mikefield
22.02.2009 um 17:22 Uhr
Hallo miniversum!

Zitat von miniversum:
Dann versuchs mal so:

Der Umweg über Skipper hilft auch nicht, es bleibt dabei:
01.
"!skiper! delims="" ist syntaktisch an dieser Stelle nicht verarbeitbar. 
02.
"-1" ist syntaktisch an dieser Stelle nicht verarbeitbar.
Herzlichst
mf
Bitte warten ..
Mitglied: bastla
22.02.2009 um 17:29 Uhr
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):
01.
:ProcessCol 
02.
set /a No=%Spalte:~0,2% 
03.
set "Loc=%Spalte:~4,5%" 
04.
REM Daten vorhanden? Falls nein, Verarbeitung hier beenden 
05.
if "%Loc%"=="     " goto :eof 
06.
set "Tim=%Spalte:~14,4%" 
07.
set /a Num=%Spalte:~22,4% 
08.
if %No% LSS 10 set "No=0%No%"
Die Korrektur habe ich auch oben eingearbeitet.

Grüße
bastla
Bitte warten ..
Mitglied: Mikefield
22.02.2009 um 17:46 Uhr
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.
01.
set /a No=%Spalte:~0,2%
Herzlichst
mf
Bitte warten ..
Mitglied: bastla
22.02.2009 um 17:52 Uhr
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]
Bitte warten ..
Mitglied: Mikefield
22.02.2009 um 18:05 Uhr
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
Bitte warten ..
Mitglied: bastla
22.02.2009 um 18:13 Uhr
Hallo Mikefield!

Dann ändere diese Zeile auf:
set "No=%No: =0%"
Grüße
bastla
Bitte warten ..
Mitglied: Mikefield
22.02.2009 um 21:37 Uhr
Hallo Bastla!

Perfekt! Vielen Dank! Nun ist alles bestens!


Herzlichst
mf
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Kl. Frage: Log-File schreiben per Batch (3)

Frage von Yauhun zum Thema Batch & Shell ...

Windows Server
gelöst Server 2012R2 Frage zum DHCP Failover (6)

Frage von Coreknabe zum Thema Windows Server ...

LAN, WAN, Wireless
Frage zum Erzeugen eines portbasiertem VLAN (7)

Frage von presto-18 zum Thema LAN, WAN, Wireless ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

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

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...