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, 3056 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!!

Mit freundlichen Grüßen, 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?

Mit freundlichen Grüßen & 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!

Mit freundlichen Grüßen, Christof
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...