PowerShell - wyodrębnianie plików z XML
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:
- Przygotuj sobie pusty folder roboczy.
- W tym folderze utwórz plik
1.cmd
o treści jak powyżej (np. użyj notatnika, kodowanie utf-8). *) - Do tego foldera skopiuj pliki XML z których mają być wyodrębnione pliki wewnętrzne.
- W pasku adresu, gdzie zwykle znajduje się zapis ścieżki do foldera wpisz
1.cmd
i naciśnij[Enter]
. - Poczekaj dłuższą chwilę, aż pojawi się napis
==koniec==
i naciśnij[Enter]
. - 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:
- https://www.powershellmagazine.com/2013/08/19/mastering-everyday-xml-tasks-in-powershell/
- https://dotnet-helpers.com/powershell/reading-xml-files-with-powershell/
- https://andrzejq.github.io/Office_S_Tips/pki/2019/09/19/Podpisy_cyfrowe.html
- Być może trafiłeś na tą stronę aby odczytać e-sprawozdanie finansowe. Możesz użyć aplikacji Ministerstwa Finansów działającej od razu w przeglądarce (bez instalacji):
https://www.podatki.gov.pl/e-sprawozdania-finansowe/aplikacja/