<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Alle Blockly + Javascripte aus einer script.json extrahieren]]></title><description><![CDATA[<p dir="auto">Hallo,<br />
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.<br />
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.<br />
Na dann frag ich mal ChatGPT und mit desen Hilfe haben wir folgendes gebaut.</p>
<p dir="auto">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</p>
<p dir="auto">1-Export-ioBroker.ps1<br />
2-Extract-Blockly.ps1</p>
<p dir="auto">ändern. Steht jeweils ganz oben darin.</p>
<p dir="auto">Auf Laufwerk C habe ich einen Ordner erstellt = iobroker_Script_recover<br />
Dann geht ihr in diesen Ordner und ertellt eine Textdatei und da fügt ihr folgendes ein.</p>
<pre><code>$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,
        '&lt;xml[\s\S]*?&lt;/xml&gt;'
    )

    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"
</code></pre>
<p dir="auto">Das nennt ihr =   1-Export-ioBroker.ps1<br />
Das ganze dann so speichern unter, in den selben Ordner.<br />
<img src="/assets/uploads/files/1782772415222-einstellungen.jpg" alt="einstellungen.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">Jetzt die zweite Datei. Wieder ein Textdokument erstellen und dort das einfügen.</p>
<pre><code>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("&lt;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:" $count
</code></pre>
<p dir="auto">Das nennt ihr =   2-Extract-Blockly.ps1<br />
Das ganze dann so speichern unter, in den selben Ordner.<br />
<img src="/assets/uploads/files/1782772869959-einstellungen2.jpg" alt="einstellungen2.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">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.</p>
<p dir="auto">Die script.json kommt jetzt auch in den auf C erstellten Ordner "iobroker_Script_recover"</p>
<p dir="auto">Nun Powershell öffnen und dort die Befehle nacheinander eingeben und mit Enter bestättigen.</p>
<p dir="auto">cd C:\iobroker_Script_recover<br />
.\1-Export-ioBroker.ps1<br />
.\2-Extract-Blockly.ps1</p>
<p dir="auto">Jetzt sollte in dem Ordner ein weiterer Odner "Export" erstellt worden sein.<br />
<img src="/assets/uploads/files/1782773429631-1.jpg" alt="1.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">In Export<br />
<img src="/assets/uploads/files/1782773711262-2.jpg" alt="2.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">auch xml für Blocklys<br />
<img src="/assets/uploads/files/1782901272830-xml.jpg" alt="xml.jpg" class=" img-fluid img-markdown" /></p>
<p dir="auto">In diesem Ordner sind alle Javascripte + Blocklys in der korrekte Ordnerstruktur vorhanden. Sollten Scripte deaktiviert sein, sind diese in einem extra Ordner Names "DEAKTIVIERT"</p>
<p dir="auto">Bei mir hat das funtioniert und ich konnte mein Blockly einfach wieder exportieren und es läuft.</p>
<p dir="auto">Gruß Michael</p>
]]></description><link>https://forum.iobroker.net/topic/84890/alle-blockly-javascripte-aus-einer-script.json-extrahieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 18:57:21 GMT</lastBuildDate><atom:link href="https://forum.iobroker.net/topic/84890.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Jun 2026 23:03:49 GMT</pubDate><ttl>60</ttl></channel></rss>