nohouse303
Goto Top

Per Batch XML ändern

Es gibt keine Probleme: Nur Herausforderungen!

Hallo, bei mir hängt es mal wieder.

Ich muss via Batch Einträge aus einer xml oder txt-Datei suchen und von false auf true setzen.
Ich habe folgenden Ansatz:

@echo on & Setlocal

:: Defintition
set Datei=FWA.txt
set Neudatei=Zeile_neu.txt
set NeueZeile="<add key="DisableDCSTrace" value="true" />"

:: Jede Zeile der Datei auslesen und an u_Prog. übergeben
for /f "delims=" %%i in (%Datei%) do call :processline "%%i"

goto :end

:processline
set Quelle=%1

:: Nach String suchen
echo %Quelle%|find "false"

:: Zeilen Schreiben in neue Datei
If %Errorlevel% == 1 echo %Quelle% >>%Neudatei%
If %Errorlevel% == 0 echo %NeueZeile% >>%Neudatei%
goto :eof

:eof

:end
:: Originaldatei wieder herstellen
del %Datei%
ren %Neudatei% %Datei%

Soweit funktioniert das auch, nur: Leider schreibt er mir in die neue Datei die Zeilen in " ".

Wie kann ich die Zeilen ohne Häckchen oben schreiben?

Über Hilfe bin ich wie immer dankbar.

Gruss der Nohouse303

Content-ID: 122412

Url: https://administrator.de/forum/per-batch-xml-aendern-122412.html

Ausgedruckt am: 22.12.2024 um 19:12 Uhr

bastla
bastla 10.08.2009 um 14:28:12 Uhr
Goto Top
Hallo Nohouse303!

Wenn's denn wirklich (native) Batch sein muss, vielleicht so:
@echo on & Setlocal

:: Defintition
set Datei=FWA.txt
set Neudatei=Zeile_neu.txt
set "NeueZeile=^<add key="DisableDCSTrace" value="true" /^>"  

:: Jede Zeile der Datei auslesen und an u_Prog. übergeben
for /f "delims=" %%i in (%Datei%) do set "Zeile=%%i" & call :processline  
:: Originaldatei wieder herstellen
move %Neudatei% %Datei%
goto :eof

:processline
::Sonderzeichen maskieren
set "Zeile=%Zeile:<=^<%"  
set "Zeile=%Zeile:>=^>%"  
:: Nach String suchen
echo "%Zeile%"|find "false">nul && (>>%Neudatei% echo %NeueZeile%) || (>>%Neudatei% echo %Zeile%)  
goto :eof
Grüße
bastla
rubberman
rubberman 10.08.2009 um 14:29:38 Uhr
Goto Top
<edit> Falsch gelesen und schon beantwortet face-wink </edit>
Nohouse303
Nohouse303 10.08.2009 um 15:14:18 Uhr
Goto Top
Hallo, Bastla,

Danke für dein schnelles Posting.

ich habe mich nicht richtig ausgedrückt. Entschuldigung.

Ich muss den Eintrag für NeueZeile suchen und den Wert von false auf true ändern.

Dein Schnipsel macht leider nicht das was ich brauche.

Kannst du nochmal eingreifen, bitte!

Danke Gruss
bastla
bastla 10.08.2009, aktualisiert am 18.10.2012 um 18:38:59 Uhr
Goto Top
Hallo Nohouse303!

Eigentlich hatte ich angenommen, Du wolltest die Zeile
<add key="DisableDCSTrace" value="false" />
durch die Zeile
<add key="DisableDCSTrace" value="true" />
ersetzen ...

Poste doch bitte (vorzugsweise mit "") einen (ausschnittsweisen) "Vorher-Nachher"-Vergleich der Datei.

Grüße
bastla

P.S.: Falls es nicht "nur" Batch sein muss (sondern auch etwas VBScript enthalten sein darf), könntest Du vielleicht auch den Batch von hier (entsprechend angepasst und mit "^" vor ">" bzw ">" in den "Such"-/"Ersetzungs"-Strings) verwenden ...
Nohouse303
Nohouse303 10.08.2009 um 22:40:33 Uhr
Goto Top
Dein Ergebnis:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath=".\;.\DCS;.\DCS\WorkflowControler\Bin;.\DCS\DataContainer\Bin;.\DCS\Language\Bin;.\Base;.\Testprocedures;.\Base\HardwareRegistry\Bin\;.\External;.\DDB" />
</assemblyBinding>
</runtime>
<system.diagnostics>
<trace autoflush="true" />
<switches>
<!--
The trace levels should be set so that all errors and warnings are logged. In some cases
it might be reasonable to apply the Info level, e.g. ProgramFlow. It is very important that
the trace levels are used correctly when traces are implemented. Here are some guidelines:
ECHO ist eingeschaltet (ON).

-->

Und so sieht die Datei aus:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath=".\;.\DCS;.\DCS\WorkflowControler\Bin;.\DCS\DataContainer\Bin;.\DCS\Language\Bin;.\Base;.\Testprocedures;.\Base\HardwareRegistry\Bin\;.\External;.\DDB" />
</assemblyBinding>
</runtime>
<system.diagnostics>
<trace autoflush="true" />
<switches>
<!--
The trace levels should be set so that all errors and warnings are logged. In some cases
it might be reasonable to apply the Info level, e.g. ProgramFlow. It is very important that
the trace levels are used correctly when traces are implemented. Here are some guidelines:

-->
<add name="TraceLevel" value="3" /> <!-- DCS Trace Level (only affects Traces at DCS Level) -->
<add name="General" value="3" /> <!-- Traces that do not fit into other categories -->

</switches>
</system.diagnostics>
<appSettings>
<add key="DisableDCSTrace" value="false" />
<add key="LogFileDirectory" value="C:\TEMP" />

Richtig: Ich muss diesen und noch mehrere Einträge von false auf true setzen.
Endschuldige bitte das nicht korrekte Posting. Wie ich das mit der Code-Formatierung hinbekomme habe ich noch nicht kappiert.

gruss der Nohouse
bastla
bastla 10.08.2009 um 23:18:15 Uhr
Goto Top
Hallo Nhouse303!

Da Du Dich offfensichtlich um die "mehreren" Einträge selbst kümmern willst, nur ein Vorschlag für "diesen" Eintrag:
@echo off & setlocal

set "Datei=FWA.txt"  
set "R=%temp%\Repl.vbs"  

set  "Von=<add key=""DisableDCSTrace"" value=""false"" />"  
set "Nach=<add key=""DisableDCSTrace"" value=""true"" />"  
>%R% echo Set fso=CreateObject("Scripting.FileSystemObject"):T=fso.OpenTextFile("%Datei%").ReadAll:fso.CreateTextFile("%Datei%",True).Write Replace(T,"%Von%","%Nach%")  
cscript //nologo %R%
Beachte bitte, dass die Anführungszeichen in der "Von"- bzw "Nach"-Angabe verdoppelt werden müssen und Groß-/Kleinschreibung berücksichtigt wird.

Es wird übrigens keine Sicherungskopie (Temporärdatei) erstellt, sondern "in" der Originaldatei ersetzt.

Grüße
bastla

P.S.: Wenn Du für diesen Kommentar "Mit Zitat" anklickst, kannst Du die Verwendung der ""-Tags sehen ...
Nohouse303
Nohouse303 10.08.2009 um 23:46:54 Uhr
Goto Top
Hallo, wenn du einen Vorschlag für alle meine Einträge hast bin ich auch nicht traurig. (face-smile
Aber das was du gepostet hast ist VB-Script. Das ist für mich leider ein No go.

Gruss und gute Nacht.

Ps.: Ich hoffe du hast noch eine Idee.
bastla
bastla 11.08.2009 um 00:45:06 Uhr
Goto Top
Hallo Nohouse303!
Aber das was du gepostet hast ist VB-Script.
Gepostet habe ich Batch - das VBScript wird vom Batch erzeugt ...

... anyhow, versuch es damit:
@echo off & Setlocal

:: Defintition
set Datei=FWA.txt
set Neudatei=Zeile_neu.txt

::Ersetzung
set "Alt=\^<add key=\"DisableDCSTrace\" value=\"false\" /\^>"  
set "Neu=^<add key="DisableDCSTrace" value="true" /^>"  
call :Replace

goto :eof

:Replace
:: Jede Zeile der Datei auslesen und an u_Prog. übergeben; dabei Leerzeilen erhalten
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do set "Zeile=%%j" & call :processline  
:: Originaldatei wieder herstellen
move "%Neudatei%" "%Datei%"  
goto :eof

:processline
if not defined Zeile (>>"%Neudatei%" echo\) & goto :eof  
set "Zeile=%Zeile:<=^<%"  
set "Zeile=%Zeile:>=^>%"  
:: Nach String suchen
echo "%Zeile%"|findstr /i /c:"%Alt%">nul && set "Zeile=%Neu%"  
>>"%Neudatei%" echo %Zeile%  
goto :eof
Was die anderen Einträge angeht: Durch wiederholte Verwendung der Zeilen 8 - 10 können auch mehrere Ersetzungen vorgenommen werden ...

Noch kurz zur Schreibweise des Suchbegriffes (%Alt%): Es müssen nicht nur (wie auch beim Ersetzungsstring %Neu%) die Umleitungszeichen "<" und ">" (durch "^") maskiert werden, sondern zusätzlich für die Verwendung mit "findstr" auch Anführungszeichen bzw "^" - in diesem Fall allerdings durch einen vorangestellten "\" ...

Grüße
bastla
Nohouse303
Nohouse303 11.08.2009 um 09:48:59 Uhr
Goto Top
Moin Moin,
vielen Dank erstmal. Wir müssten nur noch eine Kleinigkeit lösen.
Ich habe es mit IF versucht bekomme ich aber nicht hin.

Problem:
In der FWA.txt gibt es Zeilen ohne Inhalt. Wenn ich die Batch laufen lasse, wird an den Stellen
immer Echo ist angeschaltet eingetragen. Die Datei entspricht damit nicht dem Original.

Beispiel:

the trace levels are used correctly when traces are implemented. Here are some guidelines:
ECHO ist eingeschaltet (ON).
Error:

Das Progi muss im Prinzip nur einen Zeilensprung machen, wenn kein Eintrag in der Zeile ist. Aber wie?

Gruss der Nohouse303
Biber
Biber 11.08.2009 um 10:09:20 Uhr
Goto Top
Moin NoHouse303,

ändere bastlas Zeile 27 so ab:
>>"%Neudatei%" echo\%Zeile% 

Grüße
Biber
bastla
bastla 11.08.2009 um 11:02:00 Uhr
Goto Top
@Biber
Danke für die Ergänzung - diese sollte aber nur nötig sein, wenn die Zeile "ohne Inhalt" nicht völlig leer ist (dieser Fall wird bereits durch Zeile 22 behandelt), sondern zumindest ein Leerzeichen enthält.

Grüße
bastla
Nohouse303
Nohouse303 11.08.2009 um 11:11:11 Uhr
Goto Top
Hallo Biber, hallo Bastla.

Vielen Dank für Euren Input.
Es funktioniert tadellos.

Gruss der Nohouse.