PowerShell Json Suchen und Ersetzen
Hallo
Ich versuche die bookmarks Datei zu durchsuchen und einige Einträge zu löschen. Das Suchen und Ersetzen funktioniert grundsätzlich, jedoch nur bis eine neue Zeile kommt. Kann mir jemand sagen, wie ich das machen muss, damit ich über mehrere Zeilen suchen und ersetzen kann?
Ich habe z.B. folgende Zeilen in der bookmarks Datei. Nun möchte ich ab der geschweiften Klammer alles löschen.
"children": [ {
"date_added": "13227086606439531",
"guid": "93561719-8a22-4cfc-85b5-beef11e15d94",
Vielen Dank.
Ich versuche die bookmarks Datei zu durchsuchen und einige Einträge zu löschen. Das Suchen und Ersetzen funktioniert grundsätzlich, jedoch nur bis eine neue Zeile kommt. Kann mir jemand sagen, wie ich das machen muss, damit ich über mehrere Zeilen suchen und ersetzen kann?
Ich habe z.B. folgende Zeilen in der bookmarks Datei. Nun möchte ich ab der geschweiften Klammer alles löschen.
"children": [ {
"date_added": "13227086606439531",
"guid": "93561719-8a22-4cfc-85b5-beef11e15d94",
(Get-Content bookmarks) | ForEach { $_ -Replace """date_added"":\s""[0-9]*"",", " " } | Set-Content "bookmarks2"
Vielen Dank.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 628257
Url: https://administrator.de/forum/powershell-json-suchen-und-ersetzen-628257.html
Ausgedruckt am: 19.02.2025 um 22:02 Uhr
6 Kommentare
Neuester Kommentar

Ich könnte dir das jetzt sagen (Get-Content liefert dir ein Array, das kannst du mit dem Parameter -raw umgehen dann kannst du zeilenübergreifend matchen) aber ich möchte dir hier extra eine bessere Methode bei solchen Sachen aufzeigen.
Das was du da hast ist eine JSON Datei und in solchen Dateien mit Regex-Replace zu arbeiten ist Fehleranfällig weil solche Dateien hinter auch weiterhin gültig sein müssen und weil man diese nativ mit Powershell parsen und bearbeiten und zurückschreiben kann, ist das in der Regel zu bevorzugen, guckst du dieses Beispiel
Ergebnis
Du siehst das ist erstens klarer aufgebaut, sicherer und wartungsfreundlicher.
Damit kannst du auch gezielt einzelne Knoten und Properties schön komfortabel bearbeiten ohne mit Regex hantieren zu müssen oder sich gg. Fehler einzubauen.
Gruß p.
Das was du da hast ist eine JSON Datei und in solchen Dateien mit Regex-Replace zu arbeiten ist Fehleranfällig weil solche Dateien hinter auch weiterhin gültig sein müssen und weil man diese nativ mit Powershell parsen und bearbeiten und zurückschreiben kann, ist das in der Regel zu bevorzugen, guckst du dieses Beispiel
# JSON String kann natürlich auch aus einer Datei kommen, ist aber nur fürs Beispiel hier so aufgeführt
$string = @'
{
"children": [
{
"date_added": "13227086606439531",
"guid": "93561719-8a22-4cfc-85b5-beef11e15d94"
}]
}
'@
# JSON String zu einem Object konvertieren
$json = $string | ConvertFrom-Json
# Property des JSONs bearbeiten, in diesem Fall dem Knoten "children" ein leeres Array zuweisen
$json.children = @()
# JSON Object wieder in einen JSON String wandeln was du dann wieder in eine Datei wegschreiben kannst (hier fürs Beipspiel weg gelassen).
$json | ConvertTo-Json -Depth 100
Ergebnis
{
"children":
}
Damit kannst du auch gezielt einzelne Knoten und Properties schön komfortabel bearbeiten ohne mit Regex hantieren zu müssen oder sich gg. Fehler einzubauen.
Gruß p.

Für weitere Tipps wäre ich dir Dankbar.
Gerne.Ein einfaches Where-Object reicht dir hier zum Ausfiltern der jeweiligen Objects:
# ....
$json.roots.other.children = $json.roots.other.children | ?{!($_.Name -eq 'Allgemein' -and $_.type -eq 'folder')}
# ....
Also in Gänze würde ein Anpassen des Bookmark-Files des aktuellen Users für deinen Fall so aussehen: (inkl. Löschen der "checksum"-Property)
$file = "$env:LOCALAPPDATA\Microsoft\Edge\User Data\Default\Bookmarks"
$json = gc $file | ConvertFrom-Json
$json.roots.other.children = $json.roots.other.children | ?{!($_.Name -eq 'Allgemein' -and $_.type -eq 'folder')}
$json | select * -Exclude checksum | ConvertTo-Json -Depth 100 | sc $file
G. p.

Schön. Dann bitte auch den Beitrag schließen. Thanks.
G. p.
G. p.