Inhalt einer XML Datei Script ändern
Hallo zusammen,
in folgendem Script
<?xml version="1.0"?>
-<SkClientConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LastServerIndex>1</LastServerIndex>
<LastUser>11111</LastUser>
<LastWorkplace>2358</LastWorkplace>
-<SerializableFont>
<FontValue>Microsoft Sans Serif; 8,25pt</FontValue>
</SerializableFont>
<LoginMode>Manual</LoginMode>
-<Servers>
<string>192.168.101.111:520;192.168.101.120</string>
<string>192.168.101.115:520;192.168.101.119</string>
</Servers>
<CtiSocketPort>0</CtiSocketPort>
<LOGPath>LOG</LOGPath>
<Language>de</Language>
<LogoutColor>White</LogoutColor>
<MulticastGroup/>
<MulticastPort>0</MulticastPort>
<ReflectorAdr/>
<ReflectorPort>0</ReflectorPort>
<CallDiversionLoginPause>-1</CallDiversionLoginPause>
<CallDiversionWait>0</CallDiversionWait>
<Hint/>
<AllowLoginWithoutWorkplace>true</AllowLoginWithoutWorkplace>
<CloseWait>0</CloseWait>
<CloseText/>
<LocalHttpServerPort>4444</LocalHttpServerPort>
<Title/>
</SkClientConfig>
sollen beide <String>-Werte geändert werden.
Eine Anleitung zum Ändern eines Wertes habe ich bereits gefunden,
Const ForReading = 1
Const AsASCII = 0
strFixedValue1 = "10.100.82.3:520;10.100.82.5"
strFixedValue2 = "10.100.82.9:520;10.100.82.11"
If WScript.Arguments.Count > 0 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0))
If WScript.Arguments.Count > 1 Then strFixedValue = WScript.Arguments(1)
If objFSO.FolderExists(strSrcDir) Then
Set objRegExp = New RegExp
objRegExp.Global = False
objRegExp.IgnoreCase = True
For Each objFile In objFSO.GetFolder(strSrcDir).Files
If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then
'Eingabedatei lesen
Set objInFile = objFile.OpenAsTextStream(ForReading, AsASCII)
strContent = objInFile.ReadAll
objInFile.Close
'Den Wert zwischen <servers></servers>
'durch einen fixen Wert ersetzen
objRegExp.Pattern = "(<string>).*(</string>)"
strContent = objRegExp.Replace(strContent, "$1" & strFixedValue1 & "$2")
objRegExp.Pattern = "(<string>).*(</string>)"
strContent = objRegExp.Replace(strContent, "$1" & strFixedValue2 & "$2")
'Ausgabedaei schreiben
Set objOutFile = objFSO.CreateTextFile(objFSO.BuildPath(strSrcDir, objFSO.GetBaseName(objFile.Name) & "_Neu." & objFSO.GetExtensionName(objFile.Name)), True)
objOutFile.Write strContent
objOutFile.Close
End If
Next
End If
End If
aber wie kann ich beide gleichzeitig ändern?
Denn mein hier enthaltener bereits gedachter Ansatz klappt nicht.
Hat hier jemand einen schnellen Tip?
Vielen Dank im voraus
Chris27584
in folgendem Script
<?xml version="1.0"?>
-<SkClientConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LastServerIndex>1</LastServerIndex>
<LastUser>11111</LastUser>
<LastWorkplace>2358</LastWorkplace>
-<SerializableFont>
<FontValue>Microsoft Sans Serif; 8,25pt</FontValue>
</SerializableFont>
<LoginMode>Manual</LoginMode>
-<Servers>
<string>192.168.101.111:520;192.168.101.120</string>
<string>192.168.101.115:520;192.168.101.119</string>
</Servers>
<CtiSocketPort>0</CtiSocketPort>
<LOGPath>LOG</LOGPath>
<Language>de</Language>
<LogoutColor>White</LogoutColor>
<MulticastGroup/>
<MulticastPort>0</MulticastPort>
<ReflectorAdr/>
<ReflectorPort>0</ReflectorPort>
<CallDiversionLoginPause>-1</CallDiversionLoginPause>
<CallDiversionWait>0</CallDiversionWait>
<Hint/>
<AllowLoginWithoutWorkplace>true</AllowLoginWithoutWorkplace>
<CloseWait>0</CloseWait>
<CloseText/>
<LocalHttpServerPort>4444</LocalHttpServerPort>
<Title/>
</SkClientConfig>
sollen beide <String>-Werte geändert werden.
Eine Anleitung zum Ändern eines Wertes habe ich bereits gefunden,
Const ForReading = 1
Const AsASCII = 0
strFixedValue1 = "10.100.82.3:520;10.100.82.5"
strFixedValue2 = "10.100.82.9:520;10.100.82.11"
If WScript.Arguments.Count > 0 Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0))
If WScript.Arguments.Count > 1 Then strFixedValue = WScript.Arguments(1)
If objFSO.FolderExists(strSrcDir) Then
Set objRegExp = New RegExp
objRegExp.Global = False
objRegExp.IgnoreCase = True
For Each objFile In objFSO.GetFolder(strSrcDir).Files
If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then
'Eingabedatei lesen
Set objInFile = objFile.OpenAsTextStream(ForReading, AsASCII)
strContent = objInFile.ReadAll
objInFile.Close
'Den Wert zwischen <servers></servers>
'durch einen fixen Wert ersetzen
objRegExp.Pattern = "(<string>).*(</string>)"
strContent = objRegExp.Replace(strContent, "$1" & strFixedValue1 & "$2")
objRegExp.Pattern = "(<string>).*(</string>)"
strContent = objRegExp.Replace(strContent, "$1" & strFixedValue2 & "$2")
'Ausgabedaei schreiben
Set objOutFile = objFSO.CreateTextFile(objFSO.BuildPath(strSrcDir, objFSO.GetBaseName(objFile.Name) & "_Neu." & objFSO.GetExtensionName(objFile.Name)), True)
objOutFile.Write strContent
objOutFile.Close
End If
Next
End If
End If
aber wie kann ich beide gleichzeitig ändern?
Denn mein hier enthaltener bereits gedachter Ansatz klappt nicht.
Hat hier jemand einen schnellen Tip?
Vielen Dank im voraus
Chris27584
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 348863
Url: https://administrator.de/contentid/348863
Ausgedruckt am: 23.11.2024 um 09:11 Uhr
4 Kommentare
Neuester Kommentar
Moin,
bei einer Datei gebe ich MrCount recht.
Ansonsten kann vbs anscheinend gut mit XML arbeiten, da MS ein Objekt/ eine Klasse bereitstellt.
Schaue hier mal unter Punkt 4, scheint eine sehr simple Thematik zu sein (habe es selbst noch nicht getestet/ verwenden müssen):
https://technet.microsoft.com/de-de/library/2008.02.heyscriptingguy.aspx ...
Gruß
em-pie
bei einer Datei gebe ich MrCount recht.
Ansonsten kann vbs anscheinend gut mit XML arbeiten, da MS ein Objekt/ eine Klasse bereitstellt.
Schaue hier mal unter Punkt 4, scheint eine sehr simple Thematik zu sein (habe es selbst noch nicht getestet/ verwenden müssen):
https://technet.microsoft.com/de-de/library/2008.02.heyscriptingguy.aspx ...
Gruß
em-pie
Moin,
wie @em-pie schon schreibt ist die oberste Regel bei XML Dateien diese nur über einen Parser regelkonform zu verändern und nicht mit String-Replace zu arbeiten.
Also nutze die dafür vorgesehenen Objekte:
Gruß @133883
wie @em-pie schon schreibt ist die oberste Regel bei XML Dateien diese nur über einen Parser regelkonform zu verändern und nicht mit String-Replace zu arbeiten.
Also nutze die dafür vorgesehenen Objekte:
set xml = CreateObject("MSXML2.Domdocument.6.0")
xml.Load "D:\demo.xml"
set nodes = xml.SelectNodes("/SkClientConfig/Servers/string")
nodes(0).text = "erster Wert"
nodes(1).text = "zweiter Wert"
xml.Save "D:\demo.xml"