erbertb
Goto Top

Komplexen String in einer Textdatei durch einen anderen ersetzen

Hallo zusammen,

ich versuche ein automatisches Buildscript zur Versionserstellung unserer Software zu erstellen.
Dafür brauche ich unter anderem ein Batch welches mir in einer Textdatei eine Versionsnummer automatisch hochzählt.

Leider scheitere ich schon an den Grundlagen. Mit folgendem Code-Schnipsel versuche ich die derzeitige Version aus der Textdatei auszulesen und mit einem neuen String zu ersetzen.

Die Textdatei enthält nur:
$$ LOCAL cVersion := "V7 016.00"$$
$$ LOCAL cVersion := "V7 016.01"$$
$$ LOCAL cVersion := "V7 016.02"$$
$$ LOCAL cVersion := "V7 016.03"$$
$$ LOCAL cVersion := "V7 016.04"$$
$$ LOCAL cVersion := "V7 016.05"$$

setLocal EnableDelayedExpansion


SET "filename=text.txt"  

SET "OldVersion=$$   LOCAL cVersion := "V7 016.03"$$"  
SET "NewVersion=$$   LOCAL cVersion := "V7 016.04"$$"  

for /F "tokens=*" %%k IN (%filename%) DO (  

	@ECHO ON
	IF %%k == %OldVersion% (ECHO TRUE)
)

Nach der Ausführung des Batchs sollte die Datei dann so aussehen:
$$ LOCAL cVersion := "V7 016.00"$$
$$ LOCAL cVersion := "V7 016.01"$$
$$ LOCAL cVersion := "V7 016.02"$$
$$ LOCAL cVersion := "V7 016.04"$$
$$ LOCAL cVersion := "V7 016.04"$$
$$ LOCAL cVersion := "V7 016.05"$$

Das haut aber nicht hin. Kann mir hiermit jemand helfen?

Content-Key: 214780

Url: https://administrator.de/contentid/214780

Printed on: April 25, 2024 at 12:04 o'clock

Member: colinardo
colinardo Aug 20, 2013 updated at 17:08:57 (UTC)
Goto Top
Hallo erbertB, Willkommen im Forum.
wenn du Powershell nehmen kannst ist das nur eine Zeile:
(gc "D:\test.txt") -replace 'V7 016\.03','V7 016.04' | sc "D:\test.txt"  

Grüße Uwe
Member: bastla
bastla Aug 20, 2013 updated at 17:07:20 (UTC)
Goto Top
... und wenn nicht Powershell würde ich zu VBS raten:
filename = "text.txt"  
OldVersion = "$$ LOCAL cVersion := ""V7 016.03""$$"  
NewVersion = "$$ LOCAL cVersion := ""V7 016.04""$$"  

Set fso=CreateObject("Scripting.FileSystemObject")  
T = fso.OpenTextFile(filename).ReadAll
If Instr(T, OldVersion) Then fso.CreateTextFile(filename).Write Replace(T, OldVersion, NewVersion)
Anmerkung: In einer Stringkonstanten enthaltene Anführungszeichen müssen verdoppelt werden.

Grüße
bastla

P.S.: Willkommen im Forum!
Member: Endoro
Endoro Aug 20, 2013, updated at Aug 21, 2013 at 04:23:25 (UTC)
Goto Top
Hallo,
ja, einen Einzeiler für das cmd Shell Fenster kann ich dir auch anbieten:
for /f "delims=" %a in (file.txt) do @for /f tokens^=2delims^=^" %b in ("%a") do @if "%~b"=="V7 016.03" (echo($$ LOCAL cVersion := "V7 016.04"$$) else echo(%a  
lg.

PS: hej Downvoter, lass einen Kommentar da, damit ich auch noch was lernen kann!
Member: erbertB
erbertB Aug 21, 2013 at 14:07:30 (UTC)
Goto Top
So ich hab es nun geschafft, mit PowerScript geht das wirklich einfacher als per Batch!

Ist sicherlich nicht die eleganteste Lösung aber es funktioniert, danke für die Hilfe!

#Haupt Versionsname
$v = "V7 016."  
#nach Versionsnummer suchen
$x= Select-String -path .\text.txt -pattern "LOCAL cVersion"  
$x = $x.ToString()
#   LOCAL cVersion := "V7 016.03" 
#gesamte Zeile aufspalten
$y = $x.SubString($x.length-3,3)
$x = $x.SubString($x.length-11,11)
#y wiederrum zerlegen um an die Zahl zu kommen
$y=$y.Substring(0,2)
#y in int konvertieren und um 1 erhöhen und wieder zurück
$y=[int]$y
$y=$y+1
$y=$y.ToString()
#y mit 0en auffüllen und Zeile wieder zusammensetzen
$y=$y.PadLeft(2,"0")  
$y="`""+$v+$y+"`""    
$x
$y


(gc "e:\autobuild\text.txt") -replace $x,$y | sc "e:\autobuild\text.txt"