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-Key: 1133075166

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

Printed on: April 26, 2024 at 11:04 o'clock

Member: GarfieldBonn
GarfieldBonn Aug 07, 2021 at 15:48:18 (UTC)
Goto Top
HI,
da fehlen die doppelten Anführungszeichen nach den Zahlen:
Foreach-Object {$_.Replace('Mode Value="1"','Mode Value="2"')  
Gruß
kh
Member: peterhart
peterhart Aug 08, 2021 at 13:17:00 (UTC)
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
Mitglied: 149062
149062 Aug 09, 2021 updated at 07:44:13 (UTC)
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
Member: peterhart
peterhart Aug 09, 2021 updated at 15:37:18 (UTC)
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