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 Skript - txt-Files suchen, verifizieren und editieren

Frage Entwicklung Batch & Shell

Mitglied: Christof

Christof (Level 1) - Jetzt verbinden

02.03.2012, aktualisiert 22:08 Uhr, 3070 Aufrufe, 13 Kommentare

Hallo Leute!

Habe ein Problem mit einem Skript! Erst einmal eine grobe Beschreibung:

Ein Quell- und ein Zielordner sollen bis auf das heutige Log-File abgeglichen werden.
Die neuen Files sollen kopiert, und dabei editiert werden.

Details des Programmes /bzw. Ablaufplan:
in einem Verzeichnis alle txt-Files durchsuchen
--> File im Zielordner
--> heißt weitersuchen!
--> File nicht im Ordner & File nicht von Heute
--> heißt das es in den Zielordner kopiert & konvertiert werden muss!
Nach dem Konvertieren sollte die For schleife nach weiteren txt-Files suchen (bis keine neuen mehr zu finden sind)

(Konvertieren heißt in diesem fall, dass ich nach dem 8.ten & 9.ten Komma etwas einfügen will)

01.
@Echo OFF 
02.
REM ############################## VARIABLES & START-SETTINGS ##############################  
03.
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"  
04.
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"  
05.
SET "Filetyp=log" 
06.
SET "FILL=FILL_"  
07.
set YYYY=%date:~-4% 
08.
set MM=%date:~-7,2% 
09.
set DD=%date:~-10,2% 
10.
set YYYYMMDD=%YYYY%%MM%%DD% 
11.
 
12.
REM ##############################                    MAIN                      ############################## 
13.
FOR /F %%i IN ('dir /b %PATH_SOURCE%*.%Filetyp%') DO ( 
14.
	SET "File=%%~ni" 
15.
	GOTO :PRUF 
16.
17.
 
18.
GOTO :KILL 
19.
REM ##############################     Beginn of FUNKTIONS     ##############################  
20.
REM ##############################               Pruf if exists              ##############################  
21.
:PRUF  
22.
(if exist %PATH_DEST%%File%.%Filetyp% ( 'JUMP to next FOR element' ????? ) else (if not %File:~-8,8%==%YYYYMMDD% (GOTO :IMP_CON))) 
23.
 
24.
REM 'JUMP to next FOR element' 
25.
 
26.
GOTO :KILL  
27.
REM ##############################      IMPORT & CONVERT      ##############################  
28.
:IMP_CON  
29.
FOR /F "tokens=1,2,3,4,5,6,7,8,9,* delims=," %%A IN (%PATH_SOURCE%%File%.%Filetyp%) DO echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%FILL%_%%I,%%J >> %PATH_DEST%%FILE%.%Filetyp% 
30.
 
31.
'JUMP to next FOR element' ?????? 
32.
 
33.
:KILL 
Problem:
1) Es wird immer nur ein(bzw. das selbe) File kopiert & konvertiert
2) beim Konvertieren gehen Daten verloren, da nicht alle Datenfelder (bzw. Tokens) gefüllt sind.

Könnt Ihr mir helfen?

Danke vorab für Eure Hilfe!!

MFG, Christof
Mitglied: bastla
02.03.2012 um 21:01 Uhr
Hallo Christof und willkommen im Forum!

Gleich vorweg: Mit der passenden Formatierung (lässt sich auch nachträglich erreichen) liest sich Batch-Code leichter ...
Deine Beschreibung ist etwas ungenau (es werden nicht txt-Files, sondern log-Files gesucht) und unvollständig im Hinblick auf die Namen Inhalte der Dateien - insbesondere, ob und welche Sonderzeichen zu erwarten sind und wie viele Felder es in der Zeile insgesamt gibt; es wäre daher sinnvoll, eine Beispielzeile zu posten ...

... anyhow: Da Dein Vorhaben mit der Variablen %FILE% an der fehlenden "delayedExpansion" scheitert (wobei es aber eigentlich nicht nötig sein sollte, überhaupt eine eigene Variable zu verwenden,) eine etwas geänderte (und ungetestete) Variante auf Basis der derzeit vorliegenden Informationen:
01.
@Echo OFF & setlocal 
02.
REM ############################## VARIABLES & START-SETTINGS ############################## 
03.
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\" 
04.
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\" 
05.
SET "Filetyp=log" 
06.
SET "FILL=FILL_" 
07.
set YYYY=%date:~-4% 
08.
set MM=%date:~-7,2% 
09.
set DD=%date:~-10,2% 
10.
set YYYYMMDD=%YYYY%%MM%%DD% 
11.
set "Dummy=§" 
12.
 
13.
pushd "%PATH_SOURCE%" 
14.
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || ( 
15.
    for /f "usebackq delims=" %%L in ("%%i") do set "Zeile=%%L" & call :ProcessLine "%%i" 
16.
17.
popd 
18.
goto :eof 
19.
 
20.
:ProcessLine 
21.
call set "Zeile=%%Zeile:,,=,%Dummy%,%%" 
22.
call set "Zeile=%%Zeile:,,=,%Dummy%,%%" 
23.
if "%Zeile:~,1%"=="," set "Zeile=%Dummy%%Zeile%" 
24.
for /f "tokens=1-9* delims=," %%A in ("%Zeile%") do set "ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%FILL%_%%I,%%J" 
25.
call set "ZeileNeu=%%ZeileNeu:%Dummy%=%%" 
26.
setlocal enabledelayedexpansion 
27.
>>"%PATH_DEST%%~1" echo !ZeileNeu! 
28.
endlocal 
29.
goto :eof
Das Zeichen "§", das der "Dummy"-Variablen zugewiesen wird, darf im Dateiinhalt nicht vorkommen ...

Grüße
bastla
Bitte warten ..
Mitglied: Christof
02.03.2012 um 21:45 Uhr
Hi Bastla,

erst einmal besten Dank für deine Antwort, & sorry für die Formatierung. Werde es jetzt mal probieren.

Das Problem mit der Schleife ist behoben (Dank Dir ;) )

Kannst du mir den Teil-Code erklären? Wozu dient z.B. ' | '

01.
  
02.
      echo %%i|findstr /b "%YYYYMMDD%">nul || (
Zu den Datenlücken:
hier mal der original Text aus der .log:

01.
       2012/02/27 00:00:02 +01:00,BPOR:CBOCK:SRCV,1102,10881691,,2012/02/27 00:00:01.480 +01:00,@AB:H8-SUGIT:H8:E-BUS,3:2:1,ABC0105,F4636,,F4636        H8 Rohbus                 von F8-832    PV  =    845 h²\g    PUS  Reca
- Nach dem 8.ten & 9.ten Komma muss ich etwas einfügen (Dieses Merkmal ist das Einzigste was gleich bleibt)
- Alle doppelten Komma werden vom Skript verwurstet.
- Leider ist es nicht immer die gleiche Stelle, an dem die doppelten Kommata vorkommen.


Gruß & Dank!
Bitte warten ..
Mitglied: bastla
02.03.2012 um 21:51 Uhr
Hallo Christof!

Ich habe inzwischen meinen Ansatz oben erweitert, sodass auch das ",,"-Problem behandelt wird - kannst Du ja mal testen ...
echo %%i|findstr /b "%YYYYMMDD%">nul || (
gibt den Dateinamen aus und leitet das Ergebnis per "Pipe" ("|") an "findstr" weiter, welches den Anfang des Dateinamens ("/b") auf das heutige Datum prüft, ohne das Ergebnis anzuzeigen (">nul"), und nur bei "nicht gefunden" ("||" ist eine bedingte Befehlsverkettung: nur, wenn der vorherige Befehl einen Errorlevel <> 0 geliefert hat - was bei "nicht gefunden" der Fall ist - wird die nächste Anweisung ausgeführt) weiter macht ...
Zur Sicherheit noch eine Alternative unter Verwendung von (temporärem) VBS:
01.
@Echo OFF & setlocal 
02.
REM ############################## VARIABLES & START-SETTINGS ############################## 
03.
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\" 
04.
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\" 
05.
SET "Filetyp=log" 
06.
SET "FILL=FILL_" 
07.
set YYYY=%date:~-4% 
08.
set MM=%date:~-7,2% 
09.
set DD=%date:~-10,2% 
10.
set YYYYMMDD=%YYYY%%MM%%DD% 
11.
 
12.
set "VBS=%temp%\Convert.vbs" 
13.
 >"%VBS%" echo Set a=WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject"):Lines=Split(fso.OpenTextFile(a(0)).ReadAll,vbCrLf) 
14.
>>"%VBS%" echo For i=0 To UBound(Lines):Fields=Split(Lines(i),","):If UBound(Fields)^>8 Then Fields(8)=a(1)^&Fields(8):Fields(9)=a(1)^&Fields(9):End If:Lines(i)=Join(Fields,","):Next 
15.
>>"%VBS%" echo WScript.Echo Join(Lines,vbCrLf) 
16.
 
17.
SET "PATH_SOURCE=Z:\TEMP\" 
18.
SET "PATH_DEST=Z:\TEMP\Zielordner\" 
19.
 
20.
pushd "%PATH_SOURCE%" 
21.
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || ( 
22.
    cscript //nologo "%VBS%" "%%i" "%FILL%">"%PATH_DEST%%%i" 
23.
24.
popd 
25.
del "%VBS%"
Anmerkung: Da Du inzwischen die Positionen für das Einfügen mit "Nach dem 8.ten & 9.ten Komma" angegeben hast, ist das hier so umgesetzt (siehe Zeile 14) - im Batch oben wurden die Felder 8 & 9 verändert ...

Grüße
bastla
Bitte warten ..
Mitglied: Christof
02.03.2012 um 22:34 Uhr
Ja Super, nun klappt es! RESPEKT!

Nehme nun die VBS-Batch Lösung!
Die ist mal richtig schnell, nicht einmal 1min für 2Logs!

In einem LOG sind ca. 56.000Zeilen!
Das Skript soll bis zu 300Logs in der NAcht konvertieren ;)


Gruß & tausendfachen Dank!
Bitte warten ..
Mitglied: Christof
07.03.2012 um 08:12 Uhr
Hallo,

zufrüh gefreut

am lebendem System sind mir noch zwei Probleme aufgefallen:

1.) Umlaute werden nicht unterstützt (beim Copy von vbs wird alles verwurstet)
2.) Es ist möglich, dass nach dem 9.Komma kein Eintrag ist.
d.h. wenn zwischen komma 9 & 10 keine Zeichen vorhanden sind, darf hinter dem 9.Komma auch kein %FILL% eingesetzt werden

Kann mit jemand helfen?

Mfg & vielen Dank vorab! Christof
Bitte warten ..
Mitglied: bastla
07.03.2012 um 09:10 Uhr
Hallo Christof!

Versuch es mit folgender (ungetesteten) Variante:
01.
@Echo OFF & setlocal 
02.
REM ############################## VARIABLES & START-SETTINGS ############################## 
03.
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\" 
04.
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\" 
05.
SET "Filetyp=log" 
06.
SET "FILL=FILL_" 
07.
set YYYY=%date:~-4% 
08.
set MM=%date:~-7,2% 
09.
set DD=%date:~-10,2% 
10.
set YYYYMMDD=%YYYY%%MM%%DD% 
11.
set "Dummy=§" 
12.
for /f "tokens=3 delims=:. " %%i in ('chcp') do set CP=%%i 
13.
chcp 1252 >nul 
14.
 
15.
pushd "%PATH_SOURCE%" 
16.
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || ( 
17.
    for /f "usebackq delims=" %%L in ("%%i") do set "Zeile=%%L" & call :ProcessLine "%%i" 
18.
19.
popd 
20.
chcp %CP% >nul 
21.
goto :eof 
22.
 
23.
:ProcessLine 
24.
call set "Zeile=%%Zeile:,,=,%Dummy%,%%" 
25.
call set "Zeile=%%Zeile:,,=,%Dummy%,%%" 
26.
if "%Zeile:~,1%"=="," set "Zeile=%Dummy%%Zeile%" 
27.
for /f "tokens=1-9* delims=," %%A in ("%Zeile%") do ( 
28.
    if #%%I#=#%Dummy%# (set "ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%FILL%_%%I,%%J" 
29.
    ) else ( 
30.
        "ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%%I,%%J" 
31.
32.
call set "ZeileNeu=%%ZeileNeu:%Dummy%=%%" 
33.
setlocal enabledelayedexpansion 
34.
>>"%PATH_DEST%%~1" echo !ZeileNeu! 
35.
endlocal 
36.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: Christof
07.03.2012 um 09:14 Uhr
Hallo & Danke für die schnelle Antwort!


Kann man auch das VBScript umstricken, da dieses wesentlich schneller läuft als das reine Batch-Script?



Gruß, Christof
Bitte warten ..
Mitglied: bastla
07.03.2012 um 10:37 Uhr
Hallo Christof!

Dort sollte es genügen, die Zeile 14 durch
>>"%VBS%" echo For i=0 To UBound(Lines):Fields=Split(Lines(i),","):If UBound(Fields)^>8 Then Fields(8)=a(1)^&Fields(8):If Fields(9)^<^>"" Then Fields(9)=a(1)^&Fields(9):End If:End If:Lines(i)=Join(Fields,","):Next
zu ersetzen ...

Grüße
bastla
Bitte warten ..
Mitglied: Christof
07.03.2012 um 12:42 Uhr
Hey Super!


das Problem mit dem 9.Komma ist dadurch behoben.

Die Umlaute werden trotzdem noch durch den Fleischwolf gedreht. ;)

Kannst du mir da auch helfen?

Gruß, Christof
Bitte warten ..
Mitglied: bastla
07.03.2012 um 14:21 Uhr
Hallo Christof!
Die Umlaute werden trotzdem noch durch den Fleischwolf gedreht. ;)
Schwer nachvollziehbar - in Batch mit der falschen Codepage ist das klar, aber für VBS wäre eigentlich nur die Verwendung von Unicode ein Kriterium ...

Könntest Du mal einen Vorher-Nachher-Vergleich (als Code formatiert) posten?

Grüße
bastla
Bitte warten ..
Mitglied: Christof
07.03.2012 um 14:36 Uhr
Hi,


Vorher:
01.
2011/08/25 13:06:17 +02:00,ORB:TS:DE,1401,3753923,,2011/08/25 13:06:16.870 +02:00,PI6403:%0987BD,3:0:0,PI6403,F60219,,F60219       Drückdrauf               RNASS
Nachher:
01.
2011/08/25 13:06:17 +02:00,ORB:TS:DE,1401,3753923,,2011/08/25 13:06:16.870 +02:00,PI6403:%0987BD,3:0:0,FILL_PI6403,FILL_F60219,,F60219       Drckdrauf               RNASS

Gruß, Christof
Bitte warten ..
Mitglied: bastla
07.03.2012 um 15:05 Uhr
Hallo Christof!

Ich hatte gar nicht daran gedacht, dass ja die neue Datei durch den Batch (per Umleitung) erstellt wird - daher mach aus der Zeile 15
>>"%VBS%" echo fso.CreateTextFile(a(2)).Write Join(Lines,vbCrLf)
und aus der Zeile 22
cscript //nologo "%VBS%" "%%i" "%FILL%" "%PATH_DEST%%%i"
oder verwende die Zeilen 12, 13 und 20 aus meinem letzten Batch-Vorschlag zwischen den Zeilen 20 und 21 bzw zwischen 24 und 25 ...

Grüße
bastla
Bitte warten ..
Mitglied: Christof
07.03.2012 um 15:14 Uhr
TOP!
Läuft wunderbar!

Danke nochmals!

Mfg, Christof
Bitte warten ..
Ähnliche Inhalte
Sonstige Systeme
gelöst Daten aus txt-Files sammeln (16)

Frage von MegaGiga zum Thema Sonstige Systeme ...

Batch & Shell
gelöst Per Skript Ordner überwachen und Textdateien editieren und verschieben (4)

Frage von ThorstenL zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Update

Microsoft Update KB4034664 verursacht Probleme mit Multimonitor-Systemen

Tipp von beidermachtvongreyscull zum Thema Windows Update ...

Viren und Trojaner

CNC-Fräsen von MECANUMERIC werden (ggf.) mit Viren, Trojanern, Würmern ausgeliefert

(4)

Erfahrungsbericht von anteNope zum Thema Viren und Trojaner ...

Windows 10

Windows 10: Erste Anmeldung Animation deaktivieren

(3)

Anleitung von alemanne21 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Verschlüsselung & Zertifikate
SSL Zertifikat für HTTPS (33)

Frage von Hendrik2586 zum Thema Verschlüsselung & Zertifikate ...

Grafikkarten & Monitore
24" oder 27" mit Full HD oder doch mehr Auflösung? (21)

Frage von brutzler zum Thema Grafikkarten & Monitore ...

Router & Routing
gelöst Linksys wrt1200ac v2 mit dd-wrt: keine vlan-einstellungen im GUI (15)

Frage von Pixi123 zum Thema Router & Routing ...