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:
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
[convert]::ToBase64String((Get-Content "C:\Users\Administrator\Desktop\krbtgt.pl\GUI2\activeDirectory.ico" -Encoding Byte))
Następnie kod jaki trzeba dodać do skryptu
$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