apokalypso
Goto Top

Mit Batch eine XML-Datei bearbeiten

Hallo zusammen,

ich bin seit einiger Zeit hier im Forum unterwegs, um eine Lösung auf mein Problem zu finden. Ich habe mir einige Code schnipsel aus diesen und anderen Foren zusammengesetzt und bin nun nahe der Lösung.

Situation:
Im Unternehmen haben wir rund 600 User die mit PGP arbeiten, leider befindet sich in einer der Konfigurations-Dateien (XML-Datei) ein Fehler. Die User arbeiten mit Windows XP, Vista, und 7.
Mit einer Batch-Datei möchte ich eine Zeile, die zwei mal vorkommt, verändern bzw. bearbeiten.

Von: \\XXX\data\userdaten\%USERNAME%\pgp\secring.skr
Nach: \\XXX\data\userdaten\%USERNAME%\pgp\Lokal\secring.skr

Leider hat mein Code ein Problem mit "<string> .... </string>". Die Sonderzeichen, werden nicht erkannt.
Es wäre klasse wenn einer den Fehler finden könnte bzw. mir mit meinem Problem weiter hilft.

XML Ausschnitt:
...
<key>privateKeyringFile</key>
<string>\\XXX\data\userdaten\Vorname.Nachname\pgp\secring.skr</string>
<key>publicKeyringFile</key>
<string>\\XXX\data\userdaten\Vorname.Nachname\\pgp\secring.skr</string>
</dict>
...

Batch-Datei:

@echo off
SETLOCAL enabledelayedexpansion

SET "quell_datei=C:\Users\%USERNAME%\Desktop\PGP_Config.xml"
SET "ziel_datei=C:\Users\%USERNAME%\Desktop\PGP_Config_new.xml"
SET "suchen_nach=\\XXX\data\userdaten\%USERNAME%\pgp\secring.skr"
SET "ersetzen_durch=\\XXX\data\userdaten\%USERNAME%\pgp\lokal\secring.skr"

REM Quell-Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET zeile=%%i& CALL :ersetzen !zeile!
)
GOTO :weiter
:ersetzen
REM innerhalb der Variable "zeile"
REM den Inhalt der Variable "suchen_nach" suchen
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben
IF [!zeile!] EQU (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%)
GOTO :eof

:weiter
REM weitere Verarbeitung

ECHO Fertig.

Vielen Danke schon mal.
Apokalypso

Content-Key: 163224

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

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

Member: bastla
bastla Mar 23, 2011 at 14:24:29 (UTC)
Goto Top
Hallo Apokalypso und willkommen als Mitglied im Forum!

Manchmal wirken ein paar Anführungszeichen Wunder (die übrigen Änderungen sind mehr kosmetischer Natur [Edit] mit Ausnahme der Vermeidung des überflüssigen Unterprogramm-Aufrufparameters !zeile! - dem fehlten nämlich die Anführungszeichen [/Edit]):
@ECHO off & SETLOCAL enabledelayedexpansion

SET "quell_datei=C:\Users\%USERNAME%\Desktop\PGP_Config.xml"  
SET "ziel_datei=C:\Users\%USERNAME%\Desktop\PGP_Config_new.xml"  
SET "suchen_nach=\\XXX\data\userdaten\%USERNAME%\pgp\secring.skr"  
SET "ersetzen_durch=\\XXX\data\userdaten\%USERNAME%\pgp\lokal\secring.skr"  

REM Quell-Datei zeilenweise auslesen
REM und in Variable "zeile" schreiben  
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO SET "zeile=%%i" & CALL :ersetzen  
GOTO :weiter

:ersetzen
REM innerhalb der Variable "zeile"  
REM den Inhalt der Variable "suchen_nach" suchen  
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen  
SET "zeile=!zeile:%suchen_nach%=%ersetzen_durch%!"  

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben  
ECHO.!zeile!>>"%ziel_datei%"  
GOTO :eof

:weiter
REM weitere Verarbeitung

ECHO Fertig.
Das "ECHO" in Zeile 20 würde zwar auch in der verkürzten Schreibweise Leerzeilen richtig ausgeben, allerdings überleben letztere ohnehin die "FOR"-Schleife nicht (womit sich auch "FINDSTR" in der derzeitigen Form einsparen ließe) ...

Grüße
bastla

P.S.: Da Du doch sicher wissen willst, wie hier "Code"-Formatierung zu erreichen ist:
Member: Apokalypso
Apokalypso Mar 23, 2011 at 15:05:07 (UTC)
Goto Top
Hallo bastla,

danke für die schnelle Antwort.

[Edit]
Ich habe einen Denkfehler gehabt. Der Code ist vollkommen richtig.

[/Edit]

mfg Apokalypso
Member: bastla
bastla Mar 23, 2011 at 15:45:23 (UTC)
Goto Top
Hallo Apokalypso!
Ich habe einen Denkfehler gehabt. Der Code ist vollkommen richtig.
Gratuliere - einen volkommenen Code habe ich bis jetzt noch nicht geschafft (vielleicht mit Ausnahme von "@echo Hello world!") ... face-wink

Grüße
bastla
Member: Apokalypso
Apokalypso Mar 23, 2011 at 16:06:59 (UTC)
Goto Top
Danke für deine Hilfe.

Den vollständigen Code hänge ich nocheinmal an.


@ECHO off & SETLOCAL enabledelayedexpansion 

SET "quell_datei=%USERPROFILE%\XXX\PGP\PGPprefs.xml"   
SET "ziel_datei=%USERPROFILE%\XXX\PGP\PGPprefs_new.xml"   
SET "suchen_nach_1=\\XXX\data\userdaten\%USERNAME%\pgp\secring.skr"   
SET "ersetzen_durch_1=\\XXX\data\userdaten\%USERNAME%\pgp\lokal\secring.skr"   

SET "suchen_nach_2=\\XXX\data\userdaten\%USERNAME%\pgp\pubring.pkr"   
SET "ersetzen_durch_2=\\XXX\data\userdaten\%USERNAME%\pgp\lokal\pubring.pkr"  

SET "suchen_nach_3=X:\pgp"   
SET "ersetzen_durch_3=X:\pgp\lokal"  

REM Quell-Datei zeilenweise auslesen 
REM und in Variable "zeile" schreiben   
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO SET "zeile=%%i" & CALL :ersetzen   
GOTO :weiter 

:ersetzen 
REM innerhalb der Variable "zeile"   
REM den Inhalt der Variable "suchen_nach" suchen   
REM und diese durch den Inhalt der Variable "ersetzen_durch" ersetzen   
SET "zeile=!zeile:%suchen_nach_1%=%ersetzen_durch_1%!"  
 
SET "zeile=!zeile:%suchen_nach_2%=%ersetzen_durch_2%!"  

SET "zeile=!zeile:%suchen_nach_3%=%ersetzen_durch_3%!"  

REM Inhalt der Variable "zeile" in die Ausgabedatei schreiben   
ECHO.!zeile!>>"%ziel_datei%"   
GOTO :eof 

:weiter 

rename "%USERPROFILE%\XXX\PGPprefs.xml" PGPprefs_old.xml  
rename "%USERPROFILE%\XXX\PGPprefs_new.xml" PGPprefs.xml  

ECHO Fertig.
Member: Jurgster
Jurgster Feb 14, 2022 at 12:18:23 (UTC)
Goto Top
Hi alle,

FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET zeile=%%i& CALL :ersetzen !zeile!
)

Okay ich verstehe das. Kleine Änderung vorgenommen und es sieht so aus.

FOR /f "delims=" %%a IN ('FINDSTR . "%quell_datei%"') DO (
SET "line=%%a"
ECHO %line%
)

Result = script break

Es jetzt nicht die Endergebnis die ich suche nur ich Bauer das gesamte script block für block auf.

Was übersehe ich warum es nicht funktioniert?
Member: bastla
bastla Feb 14, 2022 at 12:38:11 (UTC)
Goto Top
Hallo Jurgster und willkommen im Forum!

Dein Stichwort ist "delayedExpansion".

Mit
ECHO !line!
sollte das auch in der Klammer funktionieren.

Grüße
bastla

P.S.: Der Link oben zu den Formatierungmöglichkeiten funktioniert noch immer ...
Member: Jurgster
Jurgster Feb 14, 2022 at 13:19:59 (UTC)
Goto Top
Hi bastla,

Ja nee das ist nicht meine lösung, meine snippit
@echo off
setlocal enableextensions enabledelayedexpansion
SET "file2search=.\testfiles\2022-01-28T09.17.25.989-Kopie.etc"  
SET "outputfile=.\results\findstr.txt"  
SET "part1=<TESTDEVICE costcentre=\".*\" department=\".*\".*id=\""  
SET "barcode=.*"  
SET "part2=\" info=\".*\" manufacturer=\".*\" serialno=\".*\" txt=\".*\" type=\".*\"^>.*^</TESTDEVICE^>"  
SET str2find=!part1!!barcode!!part2!
FINDSTR /R /C:"!str2find!" %file2search% > %outputfile%  
::bis hier geht es ok, nachfolgender code breaks am FOR
FOR /f "delims=" %%a IN ('FINDSTR . "%outputfile%"') DO (  
SET "line=%%a"  
ECHO "This is the result:"  
ECHO %line%
ECHO !line!
)
::habe auch folgende versucht
::SET /P firstline=<!outputfile!
::SET /P firstline=<%outputfile%
::ECHO %firstline%
PAUSE
endlocal
Member: bastla
bastla Feb 16, 2022 at 07:02:03 (UTC)
Goto Top
Hallo Jurgster!

Mit der Schreibweise
ECHO !line!
werden bei meinem Test die Zeilen der "findstr.txt" korrekt ausgegeben.

Beim Testen empfiehlt es sich übrigens, zunächst "echo on" zu verwenden und den Batch aus der CMD-Shell heraus zu starten, da Du so den Ablauf besser nachvollziehen kannst.

Im übrigen solltest Du mittlerweile ohnehin besser Powershell verwenden - stell dazu einfach eine eigene Frage ins Forum.

Grüße
bastla
Member: Jurgster
Jurgster Feb 17, 2022 at 08:13:10 (UTC)
Goto Top
Hi,

So habe eine neue ansatz genommen und nutze
 :functions
EXIT /B
Damit kann ich weiter mit %,%% und %var% arbeiten ohne !var!

Danke für den brainstorm