Centrum Skryptow - Systemy Operacyjne

Jak używać formantu siatki danych w programie Windows PowerShell? Udostępnij na: Facebook

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:

  1. Przechwycenie listy procesów i wyświetlenie ich w siatce danych po otworzeniu formularza.
  2. 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 Do początku strony

Centrum Skryptow - Systemy Operacyjne