b-real
Goto Top

Inhalt einer Datei an immer der gleichen Stelle ändern per Batch oder VBS

Hallo Community,

ich hoffe ihr könnt mir bei einem Problem helfen wo ich nicht weiterkomme. Folgende Ausgangssituation:

Ein Partner schickt uns eine DFÜ, nennen wir Sie Daten_20121116134034.dat. Der Dateiname fangt immer gleich an und hat am Schluss einen Zeitstempel. Den Inhalt dieser Datei muss ich an immer der gleichen Stelle in der 1. Zeile ändern. Das ganze soll per Batch oder VBS laufen, so dass ich es im Hintergrund als Task einbauen kann.

So sieht die erste Zeile der Datei aus:

@@PHBORD128 0128003500107 TRENTO1 TRENTO1

Es geht um den Text "TRENTO1", nur soll nicht der erste Wert geändert werden, dieser soll gleich bleiben. Nur der zweite, im obigen Beispiel fett markierte Wert soll geändert (ersetzt) werden. Stattdessen soll dann dort stehen NEUWER1.

Falls möglich soll die Datei direkt geändert werden, wenn nicht ist mir aber auch geholfen wenn die Datei neu erstellt wird und das Original gelöscht wird (Sicherungskopie wird schon beim Eintreffen der DFÜ per Skript gemacht).

Bitte um Tips wie ich das hinkriege. Danke!

Content-ID: 194473

Url: https://administrator.de/forum/inhalt-einer-datei-an-immer-der-gleichen-stelle-aendern-per-batch-oder-vbs-194473.html

Ausgedruckt am: 23.12.2024 um 16:12 Uhr

bastla
bastla 19.11.2012 aktualisiert um 11:11:29 Uhr
Goto Top
Hallo B-Real und willkommen im Forum!

Soferne der Aufbau dieser ersten Zeile immer gleich bleibt, völlig ungetestet etwa so:
@echo off & setlocal
set "Ordner=D:\Neue Daten"  
set "Name=Daten_*.dat"  
set "TextNeu=NEUWER1"  

for /f "delims=" %%i in ('dir /b "%Ordner%\%Name%"') do set "Datei=%Ordner%\%%i"  
set /p Zeile1=<"%Datei%"  
move "%Datei%" "%temp%\Daten_"  
for /f "tokens=1-3" %%i in ("%Zeile1%") do >"%Datei%" echo %%i %%j %%k %TextNeu%  
>>"%Datei%" more +1 "%temp%\Daten_"  
del "%temp%\Daten_"  
Grüße
bastla

[Edit] Fehlendes Anführungszeichen und Token %%k in Zeile 9 ergänzt[/Edit]
B-Real
B-Real 19.11.2012 um 10:51:10 Uhr
Goto Top
Hallo bastla,

danke für deine rasche Antwort. Ich habs getestet, bleibe aber mit dieser Meldung hängen: "%%i" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

Die Meldung kam gleich nach dem ersten Befehl for /f "delims=" %%i in ('dir /b "%Ordner%\%Name%"') do set "Datei=%Ordner%\%%i"

Außerdem ist mir nicht ganz klar woher das Skript wissen soll dass es TRENTO1 ersetzen soll face-smile
pieh-ejdsch
pieh-ejdsch 19.11.2012 aktualisiert um 12:55:29 Uhr
Goto Top
moin B-Real,

Du hast in der Zweiten Forschleife nach "%datei% ein fehlendes Anführungszeichen, somit interpretiert der Befehlsinterpreter den Befehl als irgendetwas nicht interpretierbares.
Das könnte in etwa so aussehen. Ich schreibs jetzt trotzdem hin, weil ichs "schon" fertig hatte:
@echo off
setlocal

for %%i in ("D:\Ordner\Daten_20????????????.dat") do call :ersetzen "%%~i"  
exit /b

:ersetzen
set "Line1="  
set /p Line1=<%1
if "%Line:~-7%" neq "NEUWER1" exit /b  
ren %1 "%~n.old"  
>%1 (
 echo %Line:~0,-8% NEUWER1
 more +1 "%~dpn.old"  
)
del "%~dpn.old"  
exit /b

edit ein do eingefügt /edit
Gruß Phil
bastla
bastla 19.11.2012 aktualisiert um 11:16:22 Uhr
Goto Top
Hallo B-Real!

Wie schon von PH angemerkt fehlte ein Anführungszeichen - ist oben ergänzt.
Außerdem ist mir nicht ganz klar woher das Skript wissen soll dass es TRENTO1 ersetzen soll face-smile
Da ich einen immer gleichen Aufbau der Zeile vorausgesetzt hatte, wird einfach der vierte Teil (auf Basis "Trennung durch Leerzeichen") der Zeile durch den neuen Wert ersetzt ...

Grüße
bastla
B-Real
B-Real 19.11.2012 um 11:31:19 Uhr
Goto Top
Hallo Leute,

danke euch beiden, aber das Ding will bei mir nicht so wie es soll. Ich bleib immer beim 1. for Befehl hängen mit der Meldung:

"%%i" kann syntaktisch an dieser Stelle nicht verarbeitet werden.
andimue
andimue 19.11.2012 um 12:18:38 Uhr
Goto Top
Hi B-Real,

hört sich für mich so an, als ob du den for-Befehl interaktiv in einer DOS-Box abzusetzen versuchst?!
Wenn du einen for-Befehl interaktiv ausprobieren willst darfst du nur ein %-Zeichen verwenden.

Gruß Andi
B-Real
B-Real 19.11.2012 aktualisiert um 12:47:57 Uhr
Goto Top
Hi andi,

also zuerst hab ich den Pfad angepasst und das Script als test.bat abgespeichert und ausgeführt. Es hat aber die Datei nicht wie gewünscht verändert und die Fehlermeldung ist natürlich nur ganz kurz sichtbar wenn ich das Script per Doppelklick ausführe.

Daraufhin hab ich mal versucht den Befehl in der Dos Box abzusetzen, wo dann dieser Fehlermeldung aufscheint.
pieh-ejdsch
pieh-ejdsch 19.11.2012 um 12:59:01 Uhr
Goto Top
kommentiere die Zeile mit einem Doppelpunkt aus:
@echo off
nacho
:@echo off

Dann teste das Script nochmal in der Kommandozeile.

Nun siehst Du auch bis wohin der Batch stapelt.

Gruß Phil
andimue
andimue 19.11.2012 aktualisiert um 13:18:42 Uhr
Goto Top
Hi,

wie gesagt, geht der for-Befehl interaktiv nur mit einem %-Zeichen.
Mach doch eine DOS-Box auf und zieh per Drag&Drop die von dir geändert test.bat dort rein. Dann siehst du die Meldung
(und ändere event. übergangsweise zum Debuggen auch noch "@echo off" in "@echo on" damit du mehr siehst)

Gruß Andi

P.S. du kannst auch mal deine test.bat hier posten damit man dir helfen kann face-smile
B-Real
B-Real 19.11.2012 aktualisiert um 13:30:08 Uhr
Goto Top
Hi Leute,

danke für eure Hilfe. Also so sieht meine Batch Datei "test1.bat" nach dem Muster von bastla aus (Im Ordner D:\Test liegt auch eine Daten_20121116134034.dat Datei):

REM @echo off & setlocal
set "Ordner=D:\test"  
set "Name=Daten_*.dat"  
set "TextNeu=NEUWER1"  

for /f "delims=" %%i in ('dir /b "%Ordner%\%Name%"') do set "Datei=%Ordner%\%%i"  
set /p Zeile1=<"%Datei%"  
move "%Datei%" "%temp%\Daten_"  
for /f "tokens=1-3" %%i in ("%Zeile1%") do >"%Datei%" echo %%i %%j %%k %TextNeu%  
>>"%Datei%" more +1 "%temp%\Daten_"  
del "%temp%\Daten_"  

Hier das Ergebnis wenn ich die erste Zeile deaktiviere und in der Dos Box ausführe:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Windows\system32>D:\test\test1.bat

C:\Windows\system32>REM @echo off & setlocal

C:\Windows\system32>set "Ordner=D:\test"  

C:\Windows\system32>set "Name=Daten_*.dat"  

C:\Windows\system32>set "TextNeu=NEUWER1"  

C:\Windows\system32>for /F "delims=" %i in ('dir /b "D:\test\Daten_*.dat"') do s  
et "Datei=D:\test\%i"  

C:\Windows\system32>set "Datei=D:\test\Daten_20121116134034.dat"  

C:\Windows\system32>set /p Zeile1= 0<"D:\test\Daten_20121116134034.dat"  

C:\Windows\system32>move "D:\test\Daten_20121116134034.dat" "C:\Users\ADMINI~1\A  
ppData\Local\Temp\Daten_"  
        1 Datei(en) verschoben.
">>" kann syntaktisch an dieser Stelle nicht verarbeitet werden.  

C:\Windows\system32>>>"D:\test\Daten_20121116134034.dat" more +1 "C:\Users\ADMIN  
I~1\AppData\Local\Temp\Daten_"  

C:\Windows\system32>

Ergebnis: Meine Daten_20121116134034.dat Datei ist weg.

Und so sieht mein Script nach Muster von Phil aus:


REM @echo on
setlocal

for %%i in ("D:\test\Daten_20121116134034.dat") do call :ersetzen "%%~i"  
exit /b

:ersetzen
set "Line1="  
set /p Line1=<%1
if "%Line:~-7%" neq "NEUWER1" exit /b  
ren %1 "%~n.old"  
>%1 (
 echo %Line:~0,-8% NEUWER1
 more +1 "%~dpn.old"  
)
del "%~dpn.old"  
exit /b

Ergebnis in der Dos Box (Datei wurde nicht verändert, sieht aus wie vorher):

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Windows\system32>D:\test\test2.bat

C:\Windows\system32>REM @echo on

C:\Windows\system32>setlocal

C:\Windows\system32>for %i in ("D:\test\Daten_20121116134034.dat") do call :erse  
tzen "%~i"  

C:\Windows\system32>call :ersetzen "D:\test\Daten_20121116134034.dat"  

C:\Windows\system32>set "Line1="  

C:\Windows\system32>set /p Line1= 0<"D:\test\Daten_20121116134034.dat"  

C:\Windows\system32>if "~-7" NEQ "NEUWER1" exit /b  

C:\Windows\system32>exit /b

C:\Windows\system32>
andimue
andimue 19.11.2012 um 14:00:06 Uhr
Goto Top
Hi,

Frage:
und in deiner Datei D:\test\Daten_20121116134034.dat ist/war auch so eine Zeile drin:

@@PHBORD128 0128003500107 TRENTO1 TRENTO1

Hinweis:
m.E. muss im Skript von pieh-eidsch die Zeile 10 so aussehen:
if "%Line1:~-7%" neq "TRENT01" exit /b   

Gruß Andi
B-Real
B-Real 19.11.2012 um 14:12:05 Uhr
Goto Top
Hi Andi,

ja der Inhalt der Datei sieht so aus:

@@PHBORD128 0128003500107 TRENTO1 TRENTO1                                                                                       
A00014100119          16112012L0004636987 

Da stehen halt dann hinten dran in der 1. Zeile noch mehr Daten zum Absender. Wird hier wegen der vielen Leerzeichen als 2-zeilig dargestellt, ist aber eine Zeile.
andimue
andimue 19.11.2012 um 14:16:07 Uhr
Goto Top
Hi B_Re0al,

das Skript von pieh-eidsch geht davon aus, dass die Zeile 1 mit dem String "TRENTO1" endet. Wenn da noch was dahinter steht ("Da stehen halt dann hinten dran in der 1. Zeile noch mehr Daten zum Absender.") dann kann das so nicht klappen.
Das muss zuerst geklärt werden, bevor man dir Lösungsvorschläge machen kann.

(ich glaube auch die Zeile 11 im Skript müsste wie folgt aussehen: ren %1 "%~n1.old")

Gruß Andi
B-Real
B-Real 19.11.2012 um 14:24:14 Uhr
Goto Top
Ja sorry, hätte ich wohl gleich am Anfang dazuschreiben sollen. Also es steht hinten dran immer noch mehr Text, DFÜ Dateien sind leider so aufgebaut dass immer alles in einer Wurscht steht. Hinter dem 2. TRENTO1 kommen also jede Menge Leerzeichen und dann weiterer Text.
andimue
andimue 19.11.2012 aktualisiert um 14:28:14 Uhr
Goto Top
Zitat von @B-Real:
Ja sorry, hätte ich wohl gleich am Anfang dazuschreiben sollen.

Ja, das hättest du wohl mal machen sollen face-sad

Ist denn der Wert TRENTO1 konstant oder kann sich das auch ändern ?

Andi
B-Real
B-Real 19.11.2012 um 14:32:33 Uhr
Goto Top
Also die 2 Werte TRENTO1 sind immer konstant an der gleichen Stelle und können sich auch nicht ändern. Werden von unserem ERP System so ausgegeben.

Die Stellen 34 bis 41 in der 1. Zeile müssen also verändert werden von TRENTO1 auf NEUWER1.
bastla
bastla 19.11.2012 um 14:53:43 Uhr
Goto Top
Hallo B-Real!

Dann hatte mein Ansatz ohenehin nie eine Chance ...

Versuch es damit:
@echo off & setlocal
set "Ordner=D:\Neue Daten"  
set "Name=Daten_*.dat"  
set "TextAlt=TRENTO1 TRENTO1"  
set "TextNeu=TRENTO1 NEUWER1"  

for /f "delims=" %%i in ('dir /b "%Ordner%\%Name%"') do set "Datei=%Ordner%\%%i"  
set /p Zeile1=<"%Datei%"  
move "%Datei%" "%temp%\Daten_"  
call set "Zeile1Neu=%%Zeile1:%TextAlt%=%TextNeu%%%"  
>"%Datei%" echo %Zeile1Neu%  
>>"%Datei%" more +1 "%temp%\Daten_"  
del "%temp%\Daten_"  
Grüße
bastla
B-Real
B-Real 19.11.2012 um 15:07:28 Uhr
Goto Top
Damit hat es funktioniert, vielen vielen Dank bastla und alle die geholfen haben! Und danke für eure Geduld face-smile