Kategorie:

Okienkowe skrypty, czyli GUI w PowerShellu cz 3

W poprzednim wpisie widzieliście jak napisać już pełnoprawną aplikację opierając się tylko na powershellu. Teraz pokaże Wam w jaki sposób przekonwertować skrypt do pliku wykonywalnego exe. Do tego celu używam biblioteki PS2EXE.

Zobaczcie w takim razie jak aplikację z poprzedniego wpisu przekształcić w plik wykonywalny exe. Wystarczy do tego jedna komenda:

PowerShell
Invoke-ps2exe -inputFile "C:\Users\Administrator\Desktop\krbtgt.pl\GUI2\AdSnapshotManager.ps1" -outputFile "C:\Users\Administrator\Desktop\krbtgt.pl\GUI2\AdSnapshotManager.exe" -noConsole -title "AD Snapshot Manager" -version "1.0.0"

Domyślnie do skompilowania ps1, na exe wystarczą 2 parametry -inputFile i -outputFile, jednak warto przyjrzeć się jeszcze kilku parametrom:

  • -noConsole – wyłącza tryb konsolowy, wszelkie błędy, czy komunikaty są wyświetlane w formie Message Box-ów
  • title, –version, –copyright, –company, –product – to informacje, które są widoczne we właściwościach pliku
  • reguireAdmin – wymagane uruchomienie z uprawnieniami administratora, jeśli UAC jest aktywny zostanie wywołany
  • iconFile – ustawienie ikony aplikacji
  • noOutput, –noError – powoduje wyłączenie przekierowania wyników skryptu, czy błędów do standardowego wyjścia, czyli w skrócie brak komunikatów, jednak może być problematyczne przy obsłudze wyjątków, gdyż aplikacja nie wyświetli błędu w oknie, a może po prostu zakończyć działanie

Wstawienie ikony do skryptu

Ikonę wewnątrz samej aplikacji należy zawrzeć w kodzie Powershellowym, np poprzez przekonwertowanie grafiki do base64 i umieszczenie w skrypcie

Konwersja ikony z pliku graficznego *.ico do base64

PowerShell
[convert]::ToBase64String((Get-Content "C:\Users\Administrator\Desktop\krbtgt.pl\GUI2\activeDirectory.ico" -Encoding Byte))

Następnie kod jaki trzeba dodać do skryptu

PowerShell
$Icon = "<ikona w base64>"

$IconBytes = [Convert]::FromBase64String($Icon)
$IconStream = New-Object IO.MemoryStream($IconBytes, 0, $IconBytes.Length)
$IconStream.Write($IconBytes, 0, $IconBytes.Length);

...

$Form.Icon = [System.Drawing.Icon]::FromHandle((new-object System.Drawing.Bitmap -argument $IconStream).GetHIcon())

W efekcie otrzymujemy

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *