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

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

Frage Entwicklung Batch & Shell

Mitglied: B-Real

B-Real (Level 1) - Jetzt verbinden

19.11.2012, aktualisiert 10:23 Uhr, 3562 Aufrufe, 18 Kommentare

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!
Mitglied: bastla
19.11.2012, aktualisiert um 11:11 Uhr
Hallo B-Real und willkommen im Forum!

Soferne der Aufbau dieser ersten Zeile immer gleich bleibt, völlig ungetestet etwa so:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Neue Daten" 
03.
set "Name=Daten_*.dat" 
04.
set "TextNeu=NEUWER1" 
05.
 
06.
for /f "delims=" %%i in ('dir /b "%Ordner%\%Name%"') do set "Datei=%Ordner%\%%i" 
07.
set /p Zeile1=<"%Datei%" 
08.
move "%Datei%" "%temp%\Daten_" 
09.
for /f "tokens=1-3" %%i in ("%Zeile1%") do >"%Datei%" echo %%i %%j %%k %TextNeu% 
10.
>>"%Datei%" more +1 "%temp%\Daten_" 
11.
del "%temp%\Daten_"
Grüße
bastla

[Edit] Fehlendes Anführungszeichen und Token %%k in Zeile 9 ergänzt[/Edit]
Bitte warten ..
Mitglied: B-Real
19.11.2012 um 10:51 Uhr
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
Bitte warten ..
Mitglied: pieh-ejdsch
19.11.2012, aktualisiert um 12:55 Uhr
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:
01.
@echo off 
02.
setlocal 
03.
 
04.
for %%i in ("D:\Ordner\Daten_20????????????.dat") do call :ersetzen "%%~i" 
05.
exit /b 
06.
 
07.
:ersetzen 
08.
set "Line1=" 
09.
set /p Line1=<%1 
10.
if "%Line:~-7%" neq "NEUWER1" exit /b 
11.
ren %1 "%~n.old" 
12.
>%1 ( 
13.
 echo %Line:~0,-8% NEUWER1 
14.
 more +1 "%~dpn.old" 
15.
16.
del "%~dpn.old" 
17.
exit /b
edit ein do eingefügt /edit
Gruß Phil
Bitte warten ..
Mitglied: bastla
19.11.2012, aktualisiert um 11:16 Uhr
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
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
Bitte warten ..
Mitglied: B-Real
19.11.2012 um 11:31 Uhr
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.
Bitte warten ..
Mitglied: andimue
19.11.2012 um 12:18 Uhr
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
Bitte warten ..
Mitglied: B-Real
19.11.2012, aktualisiert um 12:47 Uhr
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.
Bitte warten ..
Mitglied: pieh-ejdsch
19.11.2012 um 12:59 Uhr
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
Bitte warten ..
Mitglied: andimue
19.11.2012, aktualisiert um 13:18 Uhr
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
Bitte warten ..
Mitglied: B-Real
19.11.2012, aktualisiert um 13:30 Uhr
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):

01.
REM @echo off & setlocal 
02.
set "Ordner=D:\test" 
03.
set "Name=Daten_*.dat" 
04.
set "TextNeu=NEUWER1" 
05.
 
06.
for /f "delims=" %%i in ('dir /b "%Ordner%\%Name%"') do set "Datei=%Ordner%\%%i" 
07.
set /p Zeile1=<"%Datei%" 
08.
move "%Datei%" "%temp%\Daten_" 
09.
for /f "tokens=1-3" %%i in ("%Zeile1%") do >"%Datei%" echo %%i %%j %%k %TextNeu% 
10.
>>"%Datei%" more +1 "%temp%\Daten_" 
11.
del "%temp%\Daten_"
Hier das Ergebnis wenn ich die erste Zeile deaktiviere und in der Dos Box ausführe:

01.
Microsoft Windows [Version 6.1.7601] 
02.
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten. 
03.
 
04.
C:\Windows\system32>D:\test\test1.bat 
05.
 
06.
C:\Windows\system32>REM @echo off & setlocal 
07.
 
08.
C:\Windows\system32>set "Ordner=D:\test" 
09.
 
10.
C:\Windows\system32>set "Name=Daten_*.dat" 
11.
 
12.
C:\Windows\system32>set "TextNeu=NEUWER1" 
13.
 
14.
C:\Windows\system32>for /F "delims=" %i in ('dir /b "D:\test\Daten_*.dat"') do s 
15.
et "Datei=D:\test\%i" 
16.
 
17.
C:\Windows\system32>set "Datei=D:\test\Daten_20121116134034.dat" 
18.
 
19.
C:\Windows\system32>set /p Zeile1= 0<"D:\test\Daten_20121116134034.dat" 
20.
 
21.
C:\Windows\system32>move "D:\test\Daten_20121116134034.dat" "C:\Users\ADMINI~1\A 
22.
ppData\Local\Temp\Daten_" 
23.
        1 Datei(en) verschoben. 
24.
">>" kann syntaktisch an dieser Stelle nicht verarbeitet werden. 
25.
 
26.
C:\Windows\system32>>>"D:\test\Daten_20121116134034.dat" more +1 "C:\Users\ADMIN 
27.
I~1\AppData\Local\Temp\Daten_" 
28.
 
29.
C:\Windows\system32>
Ergebnis: Meine Daten_20121116134034.dat Datei ist weg.

Und so sieht mein Script nach Muster von Phil aus:


01.
REM @echo on 
02.
setlocal 
03.
 
04.
for %%i in ("D:\test\Daten_20121116134034.dat") do call :ersetzen "%%~i" 
05.
exit /b 
06.
 
07.
:ersetzen 
08.
set "Line1=" 
09.
set /p Line1=<%1 
10.
if "%Line:~-7%" neq "NEUWER1" exit /b 
11.
ren %1 "%~n.old" 
12.
>%1 ( 
13.
 echo %Line:~0,-8% NEUWER1 
14.
 more +1 "%~dpn.old" 
15.
16.
del "%~dpn.old" 
17.
exit /b
Ergebnis in der Dos Box (Datei wurde nicht verändert, sieht aus wie vorher):

01.
Microsoft Windows [Version 6.1.7601] 
02.
Copyright (c) 2009 Microsoft Corporation. Alle Rechte vorbehalten. 
03.
 
04.
C:\Windows\system32>D:\test\test2.bat 
05.
 
06.
C:\Windows\system32>REM @echo on 
07.
 
08.
C:\Windows\system32>setlocal 
09.
 
10.
C:\Windows\system32>for %i in ("D:\test\Daten_20121116134034.dat") do call :erse 
11.
tzen "%~i" 
12.
 
13.
C:\Windows\system32>call :ersetzen "D:\test\Daten_20121116134034.dat" 
14.
 
15.
C:\Windows\system32>set "Line1=" 
16.
 
17.
C:\Windows\system32>set /p Line1= 0<"D:\test\Daten_20121116134034.dat" 
18.
 
19.
C:\Windows\system32>if "~-7" NEQ "NEUWER1" exit /b 
20.
 
21.
C:\Windows\system32>exit /b 
22.
 
23.
C:\Windows\system32>
Bitte warten ..
Mitglied: andimue
19.11.2012 um 14:00 Uhr
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:
01.
if "%Line1:~-7%" neq "TRENT01" exit /b 
Gruß Andi
Bitte warten ..
Mitglied: B-Real
19.11.2012 um 14:12 Uhr
Hi Andi,

ja der Inhalt der Datei sieht so aus:

01.
@@PHBORD128 0128003500107 TRENTO1 TRENTO1                                                                                        
02.
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.
Bitte warten ..
Mitglied: andimue
19.11.2012 um 14:16 Uhr
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
Bitte warten ..
Mitglied: B-Real
19.11.2012 um 14:24 Uhr
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.
Bitte warten ..
Mitglied: andimue
19.11.2012, aktualisiert um 14:28 Uhr
Zitat von B-Real:
Ja sorry, hätte ich wohl gleich am Anfang dazuschreiben sollen.

Ja, das hättest du wohl mal machen sollen

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

Andi
Bitte warten ..
Mitglied: B-Real
19.11.2012 um 14:32 Uhr
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.
Bitte warten ..
Mitglied: bastla
19.11.2012 um 14:53 Uhr
Hallo B-Real!

Dann hatte mein Ansatz ohenehin nie eine Chance ...

Versuch es damit:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Neue Daten" 
03.
set "Name=Daten_*.dat" 
04.
set "TextAlt=TRENTO1 TRENTO1" 
05.
set "TextNeu=TRENTO1 NEUWER1" 
06.
 
07.
for /f "delims=" %%i in ('dir /b "%Ordner%\%Name%"') do set "Datei=%Ordner%\%%i" 
08.
set /p Zeile1=<"%Datei%" 
09.
move "%Datei%" "%temp%\Daten_" 
10.
call set "Zeile1Neu=%%Zeile1:%TextAlt%=%TextNeu%%%" 
11.
>"%Datei%" echo %Zeile1Neu% 
12.
>>"%Datei%" more +1 "%temp%\Daten_" 
13.
del "%temp%\Daten_"
Grüße
bastla
Bitte warten ..
Mitglied: B-Real
19.11.2012 um 15:07 Uhr
Damit hat es funktioniert, vielen vielen Dank bastla und alle die geholfen haben! Und danke für eure Geduld
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

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 ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...