Wyodrębnianie plików-załączników zakodowanych jako base64 w XML * Hybrydowy skrypt 1.CMD (CMD-PowerShell)


Niekiedy może się przydać wyodrębnianie plików binarnych zakodowanych w XML (base64). Tutaj szkic takiego skryptu o nazwie np. b64xml.ps1, który przetwarza wszystkie pliki XML z bieżącego foldera:

$i=0;                                                  Set-StrictMode -Version 3
ForEach ($plikXml in Get-ChildItem '.' -Filter *.XML) {
  ++$i; "`n$i.$($plikXml.FullName)"
  "==================== (poczekaj ...)"
  $xmlElm = New-Object -TypeName XML; $xmlElm.Load($plikXml.FullName) 
  #$xmlElm # teraz można będzie używac notacji kropkowej
        #/Dokument/TrescDokumentu/Zalaczniki/Zalacznik (skopiowne w N++: XML Tools / Current XML Path)
  $xmlElm.Dokument.TrescDokumentu.Zalaczniki.Zalacznik | ForEach-Object {
    ($nazwaPliku = "$i."+[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String( $_.nazwaPliku )))
    [System.Convert]::FromBase64String($_.DaneZalacznika) | Set-Content $nazwaPliku -Encoding Byte
  }
}

"`n==koniec=="

Ten skrypt działa na pliki XML podpisane profilem zaufanym - zob.:
-> https://www.gov.pl/web/gov/podpisz-dokument-elektronicznie-wykorzystaj-podpis-zaufany

Na tej stronie www można też sprawdzić podpis i wyodrębnić podpisane dokumenty - ale chyba tylko z pojedynczego pliku XML, więc powyższy skrypt może się przydać, gdy jest więcej plików XML.

Powyższy skrypt wygodnie jest używać jako (zob. objaśnienie):

Hybrydowy skrypt 1.CMD (CMD-PowerShell)

Skrypt o przykładowej nazwie 1.cmd wyodrębniający pliki wewnętrzne z wszystkich *.xml może wyglądać tak:

@chcp 65001>nul&more +1 "%~f0"|powershell -&pause&goto:eof
$i=0;                                                  Set-StrictMode -Version 3
ForEach ($plikXml in Get-ChildItem '.' -Filter *.XML) {
  ++$i; "`n$i.$($plikXml.FullName)"
  "==================== (poczekaj ...)"
  $xmlElm = New-Object -TypeName XML; $xmlElm.Load($plikXml.FullName) 
        #/Dokument/TrescDokumentu/Zalaczniki/Zalacznik (skopiowne w N++: XML Tools / Current XML Path)
  $xmlElm.Dokument.TrescDokumentu.Zalaczniki.Zalacznik | ForEach-Object {
    ($nazwaPliku = "$i."+[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String( $_.nazwaPliku )))
    [System.Convert]::FromBase64String($_.DaneZalacznika) | Set-Content $nazwaPliku -Encoding Byte
  }
}

"`n==koniec=="

(zob. też problem małej czcionki w oknie konsoli)

Taki skrypt można uruchomić wprost z eksploratora plików:

FileExplorer-1.cmd.png

  1. Przygotuj sobie pusty folder roboczy.
  2. W tym folderze utwórz plik 1.cmd o treści jak powyżej (np. użyj notatnika, kodowanie utf-8). *)
  3. Do tego foldera skopiuj pliki XML z których mają być wyodrębnione pliki wewnętrzne.
  4. W pasku adresu, gdzie zwykle znajduje się zapis ścieżki do foldera wpisz 1.cmd i naciśnij [Enter].
  5. Poczekaj dłuższą chwilę, aż pojawi się napis ==koniec== i naciśnij [Enter].
  6. W folderze powinny pojawić się wyodrębnione pliki wewnętrzne.

*) Jeszcze lepszym sposobem jest umieszczenie pliku 1.cmd w jednej ze ścieżek Path (w menu START zacznij pisać “Edytuj zmienne środowiskowe dla konta” aby zobaczyć/edytować listę ścieżek). Wtedy krok 2 jest zbędny.


Odnośniki: