Articles

SAPIEN Technologies (Polski)

Po wielu latach pisania skryptów dla konsoli Windows PowerShell, uczę się teraz następnego poziomu automatyzacji-pisania aplikacji GUI, które uruchamiają polecenia Windows PowerShell. Formy PowerShell Studio zapewniają łagodne i dobrze poprowadzone wprowadzenie do aplikacji GUI, ale nadal Zajęło mi trochę czasu, aby przełamać stare nawyki.

ciągle muszę sobie przypominać, że rzeczy, które „po prostu działają” w konsoli, nie mają sensu w GUI. Jednym z nich jest zapis.,

zapisanie wyjścia do konsoli

podczas generowania wyjścia w konsoli Windows PowerShell, wyjście jest wyświetlane jako ciągi tekstowe w oknie konsoli.

PS C:> Get-DateWednesday, December 3, 2014 7:16:38 AM

Za kulisami Windows PowerShell po cichu dołącza polecenie Out-String do potoku i wysyła wyniki do „standard output” („stdout”). Proces obsługujący Windows PowerShell obsługuje standardowe wyjście, prawie zawsze zapisując wyjście do konsoli(zachowanie hosta może się różnić).,

Tak więc, jeśli uruchomisz cmdlet, który zwraca obiekty, takie jak Get-proces cmdlet, (reprezentacje łańcuchowe) obiektów pojawią się w konsoli.

Jeśli formatujesz obiekty, np. za pomocą formatowania-List lub formatowania-Table, (reprezentacje łańcuchowe) sformatowanych obiektów pojawiają się w konsoli.

jeśli uruchomisz Write-Host lub Write-Output, out-Host lub Out-String, ciągi wyjściowe pojawią się w konsoli.

i nawet jeśli wyślesz wyjście do alternatywnego strumienia wyjściowego za pomocą Write-Warning, Write-Verbose lub Write-Error, domyślnie wyjście jest wyświetlane w konsoli.,

ale aplikacja GUI nie ma konsoli. Co dzieje się z wyjściem, które w przeciwnym razie trafiłoby do konsoli, gdy nie ma konsoli? A co ważniejsze, jak zarządzać wyjściami bez konsoli?

gdzie jest moje wyjście?

aplikacje GUI, takie jak te fajne, które piszesz w PowerShell Studio, nie mają konsoli. Nie ma standardowego wyjścia. Nie ma automatycznie dołączanego Out-String.

tak więc, gdy generujesz wyjście i nie zapisujesz go do pliku lub zmiennej, wyjście jest po prostu utracone.,

Get-Process | ... <Nowhere> ...

to jak miotacz rzucający baseball, gdy nie ma łapacza na boisku. Piłka po prostu spada na ziemię i toczy się do zatrzymania .. ignorowane.

Tak więc, w aplikacji GUI, nie można po prostu napisać wyjście i nadzieję na najlepsze. Jeśli chcesz wyświetlić wyjście cmdlet lub zapisać je, musisz to zrobić jawnie.

wyświetlanie wyników w polu tekstowym

aplikacja GUI jest zbiorem kontrolek. Aby wyświetlić wyjście, należy przypisać wyjście do kontrolki, takiej jak pole tekstowe, pole tekstowe bogate lub siatka danych.,

na przykład, aby wyświetlić nazwę komputera lokalnego w konsoli, należy uruchomić polecenie $env: ComputerName.

PS C:> $env:ComputerNameJUNEB-TESTBOX

Kiedy próbuję to samo w aplikacji GUI, gdzie nie ma konsoli, nie widzę żadnego wyniku w ogóle. W tym przykładzie utworzyłem formularz z przyciskiem, który po kliknięciu uruchamia wyrażenie $env: ComputerName.,

$buttonComputerName_Click = { <b>$env:ComputerName</B>}

ale kiedy klikam przycisk, nic się nie dzieje, nawet jeśli mam otwarte okno konsoli.

aby wyświetlić nazwę komputera w aplikacji GUI, dodaję kontrolkę wyświetlania do formularza i przypisuję wyjście polecenia do metody kontrolki wyświetlania.,

na przykład mogę dodać kontrolkę Textbox do formularza i użyć operatora przypisania ( = ), aby przypisać wynik wyrażenia do Właściwości textbox. Teraz, po kliknięciu przycisku, zobaczysz wyjście w polu tekstowym.

$buttonComputerName_Click = { $textboxResults.Text = $env: ComputerName}

oto wynik:

wyświetlanie wyników w innym programie

Możesz również wyświetlać wyniki poleceń w obiektach, które nie są częścią twojego programu., Specjaliści GUI uważają, że takie podejście jest niechlujne i nie jest najlepszą praktyką, ale może okazać się przydatne do testowania lub debugowania.

na przykład, możesz skierować Wyjście Do out-GridView cmdlet.

$buttonComputerName_Click = { $env:ComputerName | Out-GridView}

oto wynik:

Możesz również zapisać do pliku i otworzyć plik. Te przykładowe polecenia tworzą plik tymczasowy, zapisują go do pliku, a następnie wyświetlają go za pomocą Notatnika., Znowu, to sprawia, że prawdziwi Programiści marszczą się, ale to działa, przynajmniej w przypadku testów.

oto wynik:

konwersja na ciągi znaków

kolejnym zadaniem, którym musisz zarządzać w aplikacji GUI, jest konwersja obiektów na ciągi tekstowe. Zwykle oznacza to po prostu przekierowanie wyjścia do OUT cmdlet, takiego jak Out-String. Out cmdlety, w tym Out-GridView, konwertują obiekty na dane łańcuchowe.

gdy zapisujesz wyjście do konsoli, Windows PowerShell automatycznie dołącza polecenie Out-String do potoku., Ale nie ma konsoli ani automatycznego Out-String w aplikacji GUI.

podczas przypisywania obiektów innych niż string do obiektu string lub do kontrolki, która pobiera obiekty string, takie jak pole tekstowe, Windows PowerShell wywołuje metodę ToString() obiektu. (W innych językach, zadanie po prostu nie powiodło się, ale stara się pomóc.) W przypadku niektórych obiektów, takich jak obiekty DateTime i Errorecord, ToString () działa dobrze, ale w wielu przypadkach daje dziwne wyniki.

na przykład polecenie to przypisuje wyniki polecenia Get-Proces do pola tekstowego., Windows PowerShell rozpoznaje, że potrzebujesz tekstu i wywołuje metodę ToString () obiektów przetwarzania, ale wynik nie jest przydatny.

$buttonGetProcess_Click = { $textboxResults.Text = Get-Process} 

aby uzyskać ciągową reprezentację domyślnej tabeli procesów, wyślij Wyjście Do Out-String cmdlet, a następnie przypisz je do pola tekstowego.

$buttonGetProcess_Click = { $textboxResults.,Text = Get-Process/Out-String}

wskazówka: aby wyjście było łatwe do odczytania, ustaw pole tekstowe (lub rich text box) tak, aby używało czcionki maszynowej. W programie PowerShell Studio kliknij prawym przyciskiem myszy pole tekstowe, kliknij Zastosuj zestaw właściwości, a następnie kliknij Zastosuj czcionkę konsoli.

nie unikaj całkowicie toString (). Jest kilka obiektów, w których metoda toString() daje użyteczne wyniki. Klasycznym przykładem są obiekty DateTime. Metoda ToString () obiektu DateTime zwraca łańcuch w formacie „short-date/long-time”. Out-String zwraca format „long-date/long-time”.,

PS C:> (Get-Date).ToString()12/6/2014 10:42:24 AMPS C:> Get-Date | Out-StringSaturday, December 6, 2014 10:42:37 AM

#Uses ToString()$buttonGetDate_Click = { $textboxDate.
 

 #Uses ToString()$buttonGetDate_Click = { $textboxDate.Text = Get-Date / Out-String} 

Możesz również użyć parametrów Format i uformat cmdletu Get-Date, aby uzyskać sformatowany łańcuch daty w prawie każdej konfiguracji., Na przykład, aby uzyskać datę w formacie RFC1123, użyj -Format R (lub „r”). Nie ma potrzeby przekierowywania do Out-String, gdy używasz formatu lub UFormat, ponieważ te parametry zmuszają cmdlet do zwrócenia ciągu.

PS C:> Get-Date -Format RTue, 09 Dec 2014 10:46:41 GMT

Konwersja sformatowanych obiektów

w konsoli cmdlety formatujące, takie jak Format-Table, są zwykle ostatnim elementem w potoku. Wyjście wygląda świetnie w konsoli, ponieważ Windows PowerShell dołącza polecenie Out-String do potoku przed wysłaniem go do konsoli.,

ale w aplikacji GUI domyślnie otrzymujesz wynik wywołania metody ToString () obiektów formatu, które zwracają cmdlety formatu.

$buttonGetHotfix_Click = { $textboxHotFix.Text = Get-HotFix/Format-Table-Property HotFixID, InstalledOn-AutoSize}

aby uzyskać bardziej użyteczne wyświetlanie w aplikacji GUI, należy podłączyć obiekty formatu do Out-String cmdlet przed przypisaniem ich do Właściwości tekstowej TextBox.,

tak lepiej!

po pewnym czasie zadanie zarządzania wyświetlaczem wyjściowym w aplikacjach GUI staje się tak naturalne, jak wpisanie nazwy cmdleta, ale podczas nauki należy przetestować i upewnić się, że wszystkie dane wyjściowe są przechwytywane i wyświetlane w użytecznym formacie.

June Blender jest ewangelistą technologii w SAPIEN Technologies, Inc. Można się z nią skontaktować w [email protected] lub śledź ją na Twitterze pod adresem @ juneb_get_help.