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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 163224
Url: https://administrator.de/contentid/163224
Ausgedruckt am: 20.11.2024 um 11:11 Uhr
9 Kommentare
Neuester Kommentar
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
Das "
Grüße
bastla
P.S.: Da Du doch sicher wissen willst, wie hier "Code"-Formatierung zu erreichen ist:
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.
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:
Hi alle,
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?
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (
SET zeile=%%i& CALL :ersetzen !zeile!
)
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?
Hi bastla,
Ja nee das ist nicht meine lösung, meine snippit
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
Hallo Jurgster!
Mit der Schreibweise
werden bei meinem Test die Zeilen der "findstr.txt" korrekt ausgegeben.
Beim Testen empfiehlt es sich übrigens, zunächst "
Im übrigen solltest Du mittlerweile ohnehin besser Powershell verwenden - stell dazu einfach eine eigene Frage ins Forum.
Grüße
bastla
Mit der Schreibweise
ECHO !line!
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