NEWS
Alle Blockly + Javascripte aus einer script.json extrahieren
-
Hallo,
da ich im Moment meine Scripte aufräume und auch ein paar geändert habe, ist mir im Eifer des Gefechts leider ein Fehler passiert und ich habe ein Script (Blockly)was ich noch brauchte überschrieben und gespeichert.
Ist ja kein Problem ich mach ja mit Backitup immer schön Backups, auch von Javascript (dachte ich). Leider mußte ich feststellen das in der Backupdatei nur eine große Datei ist und zwar die script.json. Mit der konnte ich erstmal garnichts anfangen.
Na dann frag ich mal ChatGPT und mit desen Hilfe haben wir folgendes gebaut.Das muss man tun. Ich werde hier die Pfade,Ordner und Dateinamen nennen so wie ich sie nutze. Sollte ihr andere nutzen dann müßt ihr das in den Dateien
1-Export-ioBroker.ps1
2-Extract-Blockly.ps1ändern. Steht jeweils ganz oben darin.
Auf Laufwerk C habe ich einen Ordner erstellt = iobroker_Script_recover
Dann geht ihr in diesen Ordner und ertellt eine Textdatei und da fügt ihr folgendes ein.$jsonFile = "C:\iobroker_Script_recover\script.json" $root = "C:\iobroker_Script_recover\Export" New-Item -ItemType Directory -Force -Path $root | Out-Null $report = @() [int]$countJS = 0 [int]$countBlockly = 0 [int]$countDisabled = 0 $json = Get-Content $jsonFile -Raw | ConvertFrom-Json foreach ($property in $json.PSObject.Properties) { $id = $property.Name $obj = $property.Value if (-not $obj.common) { continue } if (-not $obj.common.source) { continue } $enabled = $obj.common.enabled $engineType = $obj.common.engineType $relative = $id -replace '^script\.js\.common\.', '' $parts = $relative.Split('.') $scriptName = $parts[-1] if ($parts.Count -gt 1) { $folder = Join-Path $root ($parts[0..($parts.Count-2)] -join '\') } else { $folder = $root } if (-not $enabled) { $folder = Join-Path $folder "_DEAKTIVIERT" $countDisabled++ } New-Item -ItemType Directory -Force -Path $folder | Out-Null $source = $obj.common.source $xmlMatch = [regex]::Match( $source, '<xml[\s\S]*?</xml>' ) if ($xmlMatch.Success) { $xmlFile = Join-Path $folder ($scriptName + ".xml") $xmlMatch.Value | Set-Content $xmlFile -Encoding UTF8 $source = $source.Replace( $xmlMatch.Value, "" ).Trim() $countBlockly++ } else { $countJS++ } $jsFile = Join-Path $folder ($scriptName + ".js") $source | Set-Content $jsFile -Encoding UTF8 $report += [PSCustomObject]@{ Name = $scriptName Aktiv = $enabled EngineType = $engineType Datei = $jsFile } Write-Host "Exportiert: $scriptName" } $csvFile = Join-Path $root "Scriptliste.csv" $report | Export-Csv ` -Path $csvFile ` -NoTypeInformation ` -Encoding UTF8 $statFile = Join-Path $root "Statistik.txt" @" Gesamt exportiert : $($report.Count) JavaScript : $countJS Blockly : $countBlockly Deaktiviert : $countDisabled "@ | Set-Content $statFile -Encoding UTF8 Write-Host "" Write-Host "Export abgeschlossen." Write-Host "Ordner: $root"Das nennt ihr = 1-Export-ioBroker.ps1
Das ganze dann so speichern unter, in den selben Ordner.

Jetzt die zweite Datei. Wieder ein Textdokument erstellen und dort das einfügen.
Add-Type -AssemblyName System.Web $root = "C:\iobroker_Script_recover\Export" $count = 0 Get-ChildItem $root -Recurse -Filter *.js | ForEach-Object { $file = $_.FullName $content = Get-Content $file -Raw if ($content -match '//([A-Za-z0-9+/=%]+)\s*$') { try { $encoded = $Matches[1] $bytes = [Convert]::FromBase64String($encoded) $urlText = [Text.Encoding]::UTF8.GetString($bytes) $xml = [System.Web.HttpUtility]::UrlDecode($urlText) if ($xml.StartsWith("<xml")) { $xmlFile = [System.IO.Path]::ChangeExtension( $file, ".xml" ) $xml | Set-Content $xmlFile -Encoding UTF8 Write-Host "Blockly:" $xmlFile $count++ } } catch { } } } Write-Host "" Write-Host "Blockly-Dateien gefunden:" $countDas nennt ihr = 2-Extract-Blockly.ps1
Das ganze dann so speichern unter, in den selben Ordner.

Zum testen könnt ihr nun mal aus einer Javascript Backupdatei ( sieht ungefair so aus javascripts_2026_06_29-03_37_23_backupiobroker.tar.gz) die script.json entpacken.
Die script.json kommt jetzt auch in den auf C erstellten Ordner "iobroker_Script_recover"
Nun Powershell öffnen und dort die Befehle nacheinander eingeben und mit Enter bestättigen.
cd C:\iobroker_Script_recover
.\1-Export-ioBroker.ps1
.\2-Extract-Blockly.ps1Jetzt sollte in dem Ordner ein weiterer Odner "Export" erstellt worden sein.

In Export

auch xml für Blocklys

In diesem Ordner sind alle Javascripte + Blocklys in der korrekte Ordnerstruktur vorhanden. Sollten Scripte deaktiviert sein, sind diese in einem extra Ordner Names "DEAKTIVIERT"
Bei mir hat das funtioniert und ich konnte mein Blockly einfach wieder exportieren und es läuft.
Gruß Michael
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden