Windows_PowerShell_iconniektó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."}
    }

[kod z Technet]

eN.

 

Spread the love

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Time limit is exhausted. Please reload CAPTCHA.