peterhart
Goto Top

Powershell, Ersetzen von Zeichenfolgen in ini-Datei

Hallo,
ich habe ein kleines Problem und komme einfach nicht weiter (mir fehlen detaillierte Kenntnisse).

Folgendes Problem:
In einer ini-Datei steht folgende Zeichenfolge.
<Mode Value="1" />

Diese Zeichenfolge soll ersetzt werden.
<Mode Value="2" />

Wenn ich die Powershell aufrufe, kann durch folgenden Aufruf die Zeichenfolge ersetzt und z. B. in eine neue Datei geschrieben werden
Get-Content "D:\Downloads\Batch\test.ini" | Foreach-Object {$_.Replace('Mode Value="1','Mode Value="2')} | Set-Content "D:\Downloads\BATCH\temp.ini"

Mir gelingt es leider nicht durch den Aufruf in einer Kommandozeile oder Bach-Datei die Änderung durchzuführen:
Die beiden Aufrufe werden zwar durchgeführt, in der neuen Datei steht aber nur die alte Zeichfolge <Mode Value="1" />.

powershell -command "& {Get-Content "D:\Downloads\Batch\test.ini" | Foreach-Object {$_.Replace('Mode Value="1','Mode Value="2')} | Set-Content "D:\Downloads\BATCH\temp.ini"}"
powershell -command "& Get-Content "D:\Downloads\Batch\test.ini" | Foreach-Object {$_.Replace('Mode Value="1','Mode Value="2')} | Set-Content "D:\Downloads\BATCH\temp.ini""

Anmerkung:
Da in der ini-Datei noch andere Zeichenfolgen mit <xxx Value ="1" /> enthalten sind, reicht der einfache Austausch von "1" durch "2" nicht aus.

Kann mir jemand helfen?

Gruß
Peter

Content-ID: 1133075166

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

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

GarfieldBonn
GarfieldBonn 07.08.2021 um 17:48:18 Uhr
Goto Top
HI,
da fehlen die doppelten Anführungszeichen nach den Zahlen:
Foreach-Object {$_.Replace('Mode Value="1"','Mode Value="2"')  
Gruß
kh
peterhart
peterhart 08.08.2021 um 15:17:00 Uhr
Goto Top
Danke für die Info.
M. M. n ist die Zeichensetzung richtig.
Sonst würde ja folgender Aufruf direkt in der Powershell
Get-Content "D:\Downloads\Batch\test.ini" | Foreach-Object {$_.Replace('Mode Value="1','Mode Value="2')} | Set-Content "D:\Downloads\BATCH\temp.ini"
nicht funktionieren.

Die Info hierzu habe ich hier bezogen: https://www.windowspro.de/script/sonderzeichen-quote-dollar-powershell-m ...

Aber ich habe eine Möglichkeit gefunden, welche funktioniert.
Ich habe zunächst eine Skript-Datei pstest.ps1 mit folgendem Inhalt erstellt:
Get-Content "D:\Downloads\Batch\test.ini" | Foreach-Object {$_.Replace('Mode Value="1','Mode Value="2')} | Set-Content "D:\Downloads\BATCH\temp.ini"

Dann habe ich eine Batch-Datei test.bat mit folgendem Inhalt erstellt:
powershell -command Set-ExecutionPolicy Unrestricted
powershell -Command "& 'D:\Downloads\BATCH\pstest.ps1'"
powershell -command Set-ExecutionPolicy Restricted
149062
149062 09.08.2021 aktualisiert um 09:44:13 Uhr
Goto Top
Doppelte Anführungszeichen innerhalb von doppelten Anführungszeichen müssen wie auch in so ziemlich jeder Scriptsprache also auch in ner Batch "escaped" werden in der CMD wäre das hier der Backslash ...
powershell -EP Bypass -c "Get-Content 'D:\Downloads\Batch\test.ini' | Foreach-Object {$_.Replace('Mode Value=\"1\"','Mode Value=\"2\"')} | Set-Content 'D:\Downloads\BATCH\temp.ini'"
Aber Ini-Dateien sollte man wenn möglich mit den richtigen Methoden behandeln und nicht einfach String-Replaces machen, denn Werte könnten ja in anderen Abschnitten doppelt vorkommen:
Powershell to/from INI Files
peterhart
peterhart 09.08.2021 aktualisiert um 17:37:18 Uhr
Goto Top
Danke für die Infos und den Hinweis auf die richtige Maskierung der Anführungszeichen .
Und natürlich hast Du Recht, was die Behandlung der ini-Dateien mit der entsprechenden Methode betrifft.

Das o. g. Problem war nur der Versuch die bereits funktionierende Bearbeitung einer ini-Datei (welche gem. Syntax in Wirklichkeit eine xml-Datei ist, aber die Endung ini besitzt) nach Windows XP zu portieren.
Das Windows XP SP3 dient hier rein als Plattform für eine Maschinensteuerung.


Hier der Ausschnitt aus der ini-Datei:
<?xml version="1.0" encoding="utf-8"?>
<!--de-DE deu DEU Deutsch (Deutschland) German (Germany)-->
<start.ini>
...
<SAFETY>
<Mode Value="1" />
<Flag Value="0" />
<ReducedSpeed>
<AxesSpeed Value="30" />
<UAxisSpeed Value="1000" />
<CAxisSpeed Value="1000" />
</ReducedSpeed>
<ReducedCurrentLevels>
<CurrentLevelX Value="1" />
<CurrentLevelY Value="1" />
<CurrentLevelZ Value="1" />
<CurrentLevelU Value="1" />
<CurrentLevelC Value="1" />
</ReducedCurrentLevels>
<PauseBAE Value="60" />
</SAFETY>
...
</start.ini>


Der folgende Aufruf funktionierte unter Windows 7 /8 /10 problemlos.

set "xmlpath=C:\Pfad zur ini-Datei\%INIFILE%"
powershell -Executionpolicy ByPass -Command "$xml = New-Object XML; $xml.Load('%xmlpath%');$xml.DocumentElement.SAFETY.Mode.Value = '2'; $xml.Save('%xmlpath%')"

Unter XP mit Powershell 1.0 funktionierte das irgendwie nicht.

Deshalb habe ich, wie oben beschrieben mit:
Get-Content "C:\Pfad zur ini-Datei\%INIFILE%" | Foreach-Object {$_.Replace('Mode Value="1','Mode Value="2')} | Set-Content "C:\Pfad zur ini-Datei\%INIFILE%"
versucht den entsprechenden Wert zu ändern.
Das funktionierte aber nur durch den indirekten Aufruf über die Script-Datei pstest.ps1 in welcher ich diese Befehlskette aufnahm.
Und der Wert <Mode Value="1" /> kommt auch nur einmal vor.

Soweit so gut.

Inzwischen bin ich weiter und habe eine Möglichkeit gefunden unter Windows XP die Powershell 2.0 + Microsoft .NET Framework 2.0 SP1 zu installieren (obwohl es erst ab Windows 7 freigegeben wurde)
Und jetzt funktioniert auch wieder die Bearbeitung mittels XML.

D.h., das Problem ist gelöst.

Wie gesagt, im Scripting habe ich nur rudimentäte Kenntnisse.
Deshalb vielen Dank für die Hilfe!!!

Gruß
Peter