niektóre skrypty powinny pozwolić na dodanie wyboru akcji w trakcie przetwarzania – typu ’wykonanie akcji A, naciśnij 'A’, akcja B, naciśnij 'B’, wyjdź 'W”… ogólnie należy unikać takiego kodu ale czasem chcemy zrobić skrypt 'miły’, user-friendly. metod jest kilka, a im bardziej user-friendly tym mniej uniwersalna.
źle
najładniejszą będzie oczywiście dodanie formatki GUI. formatka GUI wymaga bibliotek graficznych. znaleźć można różne wynalazki, z których najśmieszniejszy to korzystanie z WSH O_o’ [ nieznoszę takich frankensteinów]. .NET zawiera oczywiście odpowiednie klasy, można więc skorzystać z klasy System.Windows.Forms.Messagebox – tutaj praktyczny przykład. podstawowe wady tej metody to: wymaga bibliotek Forms, czyli nie zadziała na wersjach Core, oraz nie zadziała w sesjach zdalnych (remoting).
lepiej
inną metodą jest zwykły ReadKey. trzeba niemniej uważać na sposób jego wywołania. najprostsza metoda wywali się w sesji zdalnej:
[remote]: PS C:\scriptz> [console]::ReadKey() Exception calling "ReadKey" with "0" argument(s): "Cannot read keys when either application does not have a console or when console input has been redirected from a file. Try Console.Read." At line:1 char:1 + [console]::ReadKey() + ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : InvalidOperationException
można zatem użyć metody z obiektu host:
[remote]: PS C:\scriptz> $host.UI.RawUI.ReadKey("NoEcho,includeKeyDown") VirtualKeyCode Character ControlKeyState KeyDown -------------- --------- --------------- ------- 89 y 0 True
ta jednak metoda wymaga, aby host ją obsługiwał, czyli nie zadziała np. w ISE.
najlepiej
najbardziej natywny 'PowerShell’ to wykorzystanie metody PromptForChoice obiektu Host.UI, z którego korzystają commandlety. Dzięki temu zachowany jest spójny 'user-experience’, a metoda zadziała w sesji zdalnej, ISE, konsoli itp, itd [w ISE wyświetli okienko (: ]:
$title = "Delete Files" $message = "Do you want to delete the remaining files in the folder?" $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", ` "Deletes all the files in the folder." $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No", ` "Retains all the files in the folder." $options = [System.Management.Automation.Host.ChoiceDescription[]]($yes, $no) $result = $host.ui.PromptForChoice($title, $message, $options, 0) switch ($result) { 0 {"You selected Yes."} 1 {"You selected No."} }
eN.