Batch Skript - txt-Files suchen, verifizieren und editieren
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)
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
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)
@Echo OFF
REM ############################## VARIABLES & START-SETTINGS ##############################
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"
SET "Filetyp=log"
SET "FILL=FILL_"
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set YYYYMMDD=%YYYY%%MM%%DD%
REM ############################## MAIN ##############################
FOR /F %%i IN ('dir /b %PATH_SOURCE%*.%Filetyp%') DO (
SET "File=%%~ni"
GOTO :PRUF
)
GOTO :KILL
REM ############################## Beginn of FUNKTIONS ##############################
REM ############################## Pruf if exists ##############################
:PRUF
(if exist %PATH_DEST%%File%.%Filetyp% ( 'JUMP to next FOR element' ????? ) else (if not %File:~-8,8%==%YYYYMMDD% (GOTO :IMP_CON)))
REM 'JUMP to next FOR element'
GOTO :KILL
REM ############################## IMPORT & CONVERT ##############################
:IMP_CON
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%
'JUMP to next FOR element' ??????
: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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 181371
Url: https://administrator.de/forum/batch-skript-txt-files-suchen-verifizieren-und-editieren-181371.html
Ausgedruckt am: 15.05.2025 um 03:05 Uhr
13 Kommentare
Neuester Kommentar
Hallo Christof und willkommen im Forum!
Gleich vorweg: Mit der passenden (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 "
Das Zeichen "§", das der "Dummy"-Variablen zugewiesen wird, darf im Dateiinhalt nicht vorkommen ...
Grüße
bastla
Gleich vorweg: Mit der passenden (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:@Echo OFF & setlocal
REM ############################## VARIABLES & START-SETTINGS ##############################
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"
SET "Filetyp=log"
SET "FILL=FILL_"
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set YYYYMMDD=%YYYY%%MM%%DD%
set "Dummy=§"
pushd "%PATH_SOURCE%"
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || (
for /f "usebackq delims=" %%L in ("%%i") do set "Zeile=%%L" & call :ProcessLine "%%i"
)
popd
goto :eof
:ProcessLine
call set "Zeile=%%Zeile:,,=,%Dummy%,%%"
call set "Zeile=%%Zeile:,,=,%Dummy%,%%"
if "%Zeile:~,1%"=="," set "Zeile=%Dummy%%Zeile%"
for /f "tokens=1-9* delims=," %%A in ("%Zeile%") do set "ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%FILL%_%%I,%%J"
call set "ZeileNeu=%%ZeileNeu:%Dummy%=%%"
setlocal enabledelayedexpansion
>>"%PATH_DEST%%~1" echo !ZeileNeu!
endlocal
goto :eof
Grüße
bastla
Hallo Christof!
Ich habe inzwischen meinen Ansatz oben erweitert, sodass auch das ",,"-Problem behandelt wird - kannst Du ja mal testen ...
Zur Sicherheit noch eine Alternative unter Verwendung von (temporärem) 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
Ich habe inzwischen meinen Ansatz oben erweitert, sodass auch das ",,"-Problem behandelt wird - kannst Du ja mal testen ...
echo %%i|findstr /b "%YYYYMMDD%">nul || (
@Echo OFF & setlocal
REM ############################## VARIABLES & START-SETTINGS ##############################
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"
SET "Filetyp=log"
SET "FILL=FILL_"
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set YYYYMMDD=%YYYY%%MM%%DD%
set "VBS=%temp%\Convert.vbs"
>"%VBS%" echo Set a=WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject"):Lines=Split(fso.OpenTextFile(a(0)).ReadAll,vbCrLf)
>>"%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
>>"%VBS%" echo WScript.Echo Join(Lines,vbCrLf)
SET "PATH_SOURCE=Z:\TEMP\"
SET "PATH_DEST=Z:\TEMP\Zielordner\"
pushd "%PATH_SOURCE%"
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || (
cscript //nologo "%VBS%" "%%i" "%FILL%">"%PATH_DEST%%%i"
)
popd
del "%VBS%"
Grüße
bastla
Hallo Christof!
Versuch es mit folgender (ungetesteten) Variante:
Grüße
bastla
Versuch es mit folgender (ungetesteten) Variante:
@Echo OFF & setlocal
REM ############################## VARIABLES & START-SETTINGS ##############################
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"
SET "Filetyp=log"
SET "FILL=FILL_"
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set YYYYMMDD=%YYYY%%MM%%DD%
set "Dummy=§"
for /f "tokens=3 delims=:. " %%i in ('chcp') do set CP=%%i
chcp 1252 >nul
pushd "%PATH_SOURCE%"
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || (
for /f "usebackq delims=" %%L in ("%%i") do set "Zeile=%%L" & call :ProcessLine "%%i"
)
popd
chcp %CP% >nul
goto :eof
:ProcessLine
call set "Zeile=%%Zeile:,,=,%Dummy%,%%"
call set "Zeile=%%Zeile:,,=,%Dummy%,%%"
if "%Zeile:~,1%"=="," set "Zeile=%Dummy%%Zeile%"
for /f "tokens=1-9* delims=," %%A in ("%Zeile%") do (
if #%%I#=#%Dummy%# (set "ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%FILL%_%%I,%%J"
) else (
"ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%%I,%%J"
)
call set "ZeileNeu=%%ZeileNeu:%Dummy%=%%"
setlocal enabledelayedexpansion
>>"%PATH_DEST%%~1" echo !ZeileNeu!
endlocal
goto :eof
bastla
Hallo Christof!
Könntest Du mal einen Vorher-Nachher-Vergleich (als Code formatiert) posten?
Grüße
bastla
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
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
und aus der Zeile 22
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
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)
cscript //nologo "%VBS%" "%%i" "%FILL%" "%PATH_DEST%%%i"
Grüße
bastla