Jak używać formantu siatki danych w programie Windows PowerShell?
Skrypciarze odpowiadają na Wasze pytania
Witamy w rubryce TechNet, w której Skrypciarze z firmy Microsoft odpowiadają na częste pytania dotyczące używania skryptów w administracji systemu. Jeśli macie jakieś pytania z tej dziedziny, zachęcamy do wysłania e-maila na adres: scripter@microsoft.com. Nie możemy zagwarantować odpowiedzi na każde otrzymane pytanie, ale staramy się jak możemy.
Informacje o autorze: Ravikanth pracuje w firmie Dell Inc. jako główny inżynier w zespole rozwiązań Microsoft SharePoint. Pasjonuje się automatyzacją i programem Windows PowerShell. Regularnie publikuje w swoim blogu (j.ang.) artykuły poświęcone programowi Windows PowerShell, SharePoint i technologiom wirtualizacji serwerów firmy Microsoft. Jest również moderatorem forum Skrypciarzy (j.ang.) i częstym prelegentem na spotkaniach grupy użytkowników Bangalore IT Pro (j.ang.).
W jednym z wcześniejszych artykułów Ed Wilson zaprezentował, jak utworzyć graficzny interfejs użytkownika za pomocą programu Windows PowerShell i narzędzia SAPIEN PrimalForms. Narzędzie PrimalForms pozwala w bardzo łatwy sposób tworzyć rozbudowane interfejsy graficzne skryptów programu Windows PowerShell. Możne wyeksportować kod generujący interfejs graficzny do skryptu programu Windows PowerShell, a następnie dostosować go do własnych potrzeb. Tak przy okazji: do generowania graficznego interfejsu użytkownika używamy obszaru nazw System.Windows.Forms. Istnieje wiele formantów graficznego interfejsu użytkownika (j.ang.)obsługiwanych przez ten obszar nazw. W dzisiejszym artykule zajmiemy się przykładem przedstawiającym, jak używać formantu DataGrid do wyświetlania danych w formie tabeli.
Najpierw projektujemy formularz interfejsu graficznego przy użyciu narzędzia PrimalForms Community Edition firmy SAPIEN. Nazwijmy nasz formularz Menedżerem procesów. Projekt jest prosty. Umieszczamy formant DataGrid i trzy przyciski, na każdym z nich umieszczając wybrany tekst opisujący działanie. Po wczytaniu formularz ten będzie podawał listę uruchomionych procesów i pozwalał na zatrzymanie wybranego procesu lub na odświeżenie wyświetlanych informacji o procesie.
Po zakończeniu projektowania eksportujemy formularz do skryptu programu Windows PowerShell przy użyciu opcji „Export PowerShell”. W ten sposób zostaje wygenerowany kod potrzebny do utworzenia formularza interfejsu graficznego w programie Windows PowerShell. Następnie musimy dokonać edycji skryptu i dodać do niego niestandardowy kod, potrzebny do utworzenia menedżera procesów.
Aby nasz menedżer działał, musimy wprowadzić zmiany pozwalające na wykonanie zadań podanych poniżej:
- Przechwycenie listy procesów i wyświetlenie ich w siatce danych po otworzeniu formularza.
- Zapewnienie oczekiwanego działania wszystkich trzech przycisków.
Zanim przejdziemy do szczegółów, rzućmy okiem na tworzenie formantu DataGrid. Poniższy kod jest generowany przez narzędzie PrimalForms i powoduje dodanie formantu DataGrid do głównego formularza:
$dataGrid1 = New-Object System.Windows.Forms.DataGrid
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Width = 492
$System_Drawing_Size.Height = 308
$dataGrid1.Size = $System_Drawing_Size
$dataGrid1.DataBindings.DefaultDataSourceUpdateMode = 0
$dataGrid1.HeaderForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0)
$dataGrid1.Name = "dataGrid1"
$dataGrid1.DataMember = ""
$dataGrid1.TabIndex = 0
$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 13
$System_Drawing_Point.Y = 48
$dataGrid1.Location = $System_Drawing_Point
$form1.Controls.Add($dataGrid1)
Używamy obszaru nazw System.Windows.Forms.DataGrid do utworzenia wystąpienia o nazwie $datagrid1. Po utworzeniu tego wystąpienia przypisujemy wartości właściwościom odpowiadającym za wielkość siatki, nazwę itp. Ale to jeszcze nie koniec. Musimy przypisać źródło danych dotyczących procesów, które mają być wyświetlane w siatce.
Aby wyświetlić informacje o procesach w siatce danych przy uruchomieniu skryptu, musimy dodać odpowiedni kod do zdarzenia wczytywania formularza — $form1.Add_Load(). Ze względu na to, że przycisk Odśwież również powinien wyświetlać informacje o procesach, utworzymy funkcję. Pozwoli nam to dwukrotnie użyć kodu zdarzeń wczytania formularza i kliknięcia przycisku odświeżenia.
Poniższy kod odpowiada funkcji utworzonej do wyświetlania w siatce danych informacji o procesach.
function Get-ProcessInfo {
$array = New-Object System.Collections.ArrayList
$Script:procInfo = Get-Process | Select Id,Name,Path,Description,VM,WS,CPU,Company | sort -Property Name
$array.AddRange($procInfo)
$dataGrid1.DataSource = $array
$form1.refresh()
}
W obrębie funkcji Get-ProcessInfo tworzymy wystąpienia obiektu System.Collections.ArrayList i obiektu $procInfo, a następnie umieszczamy je w zakresie skryptu (j.ang.), dzięki czemu będą one dostępne dla innych funkcji. Po pobraniu informacji o procesach przy użyciu apletu polecenia Get-Process, dodajemy obiekt $procInfo do tablicy $array i przypisujemy tablicę $array jako źródło danych obiektu $dataGrid1. Po przypisaniu właściwości DataSource upewniamy się, że wyświetlimy dane w siatce, odświeżając przycisk za pomocą polecenia $form1.refresh().
Aby upewnić się, że informacje o procesach są wyświetlane w siatce danych przy uruchomieniu skryptu, dodajemy następujący kod do elementu $OnLoadForm_UpdateGrid:
$OnLoadForm_UpdateGrid=
{
Get-ProcessInfo
}
Następnie wywołujemy go, używając zdarzenia $form1.add_load():
#Zdarzenie dodania formularza
$form1.add_Load($OnLoadForm_UpdateGrid)
W ten sposób informacje o procesach zostaną wyświetlone w siatce danych, tak jak to widać poniżej:
Teraz przejdźmy do drugiej części interfejsu graficznego menedżera użytkownika. Musimy włączyć przyciski „Odśwież”, „Zakończ proces” i „Zamknij”, widoczne na formularzu. Przycisk odświeżania powinien odświeżać informacje o procesach wyświetlane w siatce danych. Przycisk kończenia procesu powinien przerywać wybrany proces, a przycisk zamykania powinien zamykać główny formularz. Aby umożliwić wykonywanie potrzebnych nam działań po kliknięciu przycisków, dodamy zdarzenia Add_click(), którym przypiszemy odpowiedni kod.
Mamy już kod potrzebny do odświeżenia formularza w postaci funkcji Get-ProcessInfo, więc w zdarzeniu $button1.Add_click() po prostu wywołujemy tę funkcję:
$button1_OnClick=
{
Get-ProcessInfo
}
#Dodanie zdarzenia
$button1.add_Click($button1_OnClick)
Aby zatrzymać wybrany proces, dodajemy następujący kod do elementu $button2_OnClick i dodajemy go do zdarzenia $button2.Add_click():
$button2_OnClick=
{
$selectedRow = $dataGrid1.CurrentRowIndex
if (($procid=$Script:procInfo[$selectedRow].Id)) {
Stop-Process -Id $procid -Confirm
}
}
#Dodanie zdarzenia
$button2.add_Click($button2_OnClick)
Powyższy kod pozwala nam uzyskać indeks zaznaczonego wiersza w zmiennej $selectedRow. Następnie używamy tej zmiennej do pobrania identyfikatora wybranego procesu. Proces można zaznaczyć klikając nagłówek wiersza lub w dowolnym miejscu wiersza. Po zaznaczeniu wiersza w jego nagłówku pojawia się oznaczenie, tak jak to widać na poniższej grafice.
Po przechwyceniu identyfikatora procesu w zmiennej $procid, używamy apletu polecenia Stop-Process do jego zakończenia. Używamy też parametru -Confirm z apletem polecenia Stop-Process.
Tak więc kiedy uruchomimy skrypt przy użyciu Windows PowerShell ISE i podejmiemy próbę zatrzymania procesu, zobaczymy coś zbliżonego do poniższej grafiki.
I na koniec przypisujemy $form1.Close() do elementu $button3_OnClick i dodajemy go do zdarzenia $button3.add_click(), aby włączyć przycisk Zamknij.
Pełen kod omówiony w niniejszym artykule można znaleźć w Repozytorium skryptów (j.ang.).
Jak dotąd przedstawiliśmy dosyć podstawowe zastosowanie siatki danych. Możemy zautomatyzować odświeżanie siatki, stosując klasę timer (j.ang.). Nieco bardziej zaawansowany przykład formantu siatki danych, użytego wraz z formantem TreeView, można znaleźć w skrypcie Windows PowerShell Remote File Explorer, dostępnym w witrynie http://psremoteexplorer.codeplex.com (j.ang.).
Do początku strony |