Centrum Skryptow - Systemy Operacyjne

Jak używać zadań programu Windows PowerShell w skrypcie?

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.

*

Jak używać zadań programu Windows PowerShell w skrypcie?

Cześć, Skrypciarze! Wszystkie przykłady zastosowania zadań programu Windows PowerShell, jakie publikujecie w tym tygodniu, dotyczą wiersza poleceń. Czy zadań programu Windows PowerShell można używać w skrypcie? Jeśli tak, jak to zrobić?

— AG

Cześć, AG!

Czołem, tutaj skrypciarz Ed Wilson, do usług. Dziś rano trawnik przed moim domem jest cały zasnuty mgłą. Mam ciągle zapuchnięte oczy z zaspania i nie w pełni przyswoiłem jeszcze wrażenie, jakie zrobiła na mnie nocna inwersja temperatury. Nie spałem do bardzo późnej nocy (albo bardzo wczesnego ranka), ponieważ miałem połączenie konferencyjne ze swoim uczniem Jitem, który mieszka w Canberrze. Późny wieczór w Charlotte to poranek w Australii. Omawialiśmy duży projekt migracji w Exchange, którego przeprowadzenie planuje Jit, i jak ułatwić jego realizację przy użyciu programu Windows PowerShell i sprawić, by był on mniej kłopotliwy dla użytkowników.

Zawsze lubię rozmowy z Jitem ze względu na jego błyskotliwą inteligencję. Rzecz jasna wolę rozmawiać z nim osobiście, tak jak w zeszłym roku, kiedy to prowadziłem w Australii zaawansowane warsztaty z programu Windows PowerShell. W któryś weekend wraz ze Skrypciarską Żoną, Jitem, Chrisem i Pete'em zrobiliśmy wycieczkę nad morze, aby porobić zdjęcia i trochę ponurkować. Poniższe zdjęcie zrobiłem, kiedy drugi raz tego dnia szliśmy nurkować. Jak sobie możecie wyobrazić, wędrówka w sprzęcie do nurkowania, ważącym ponad 50 kg, była niezapomnianym przeżyciem.

AG, używając zadań w skrypcie, należy stosować takie same procedury jak te, które omawialiśmy w poniedziałek i wtorek.

W skrypcie UseJobsToGetProcessAndService.ps1 używane są dwa zadania. W pierwszym z nich stosujemy aplet polecenia Get-Process do zwrócenia listy procesów, a w drugim używamy apletu polecenia Get-Service, który zwraca listę usług. Widać to poniżej:

Start-Job -Name process -ScriptBlock { Get-Process }

Start-Job -Name Service -ScriptBlock { Get-Service }

Na moim komputerze skrypt działa tak szybko, że zadania nie mają czasu na zakończenie działania. Aby temu zaradzić, spowolniłem go o kilka sekund. W tym celu użyłem apletu polecenia Start-Sleep, wprowadzając trzy sekundy przerwy. Widać to poniżej:

"Wstrzymanie na 3 sekundy..."

start-sleep -Seconds 3

Po zakończeniu przerwy w działaniu skryptu, instrukcja Foreach powoduje przejście przez zarejestrowane na komputerze zadania. Używamy zmiennej $job do przechowania każdego z obiektów zadań zwróconych przez aplet polecenia Get-Job. Widać to poniżej:

Foreach ($job in Get-Job)

Nie chcemy podejmować próby odebrania zadania, jeśli jest ono ciągle uruchomione. Tak więc sprawdzamy stan zadania, przeprowadzając inspekcję właściwości state obiektu job. Jeśli okaże się, że zadanie zostało zakończone, możemy użyć apletu polecenia Receive-Job, aby zwrócić zakończone zadanie. Pracujemy tylko z jednym zadaniem naraz, możemy więc użyć właściwości job.id obiektu job, by je odebrać. Używamy też właściwości command oraz id do wyświetlenia komunikatu o stanie przed właściwym odebraniem zadania. Widać to poniżej:

if($job.state -eq 'Completed')

    {

     "Odbieranie zadania o identyfikatorze $($job.id), które wykonuje polecenie $($job.command)`r`n"

     Start-Sleep -Seconds 1

     Receive-Job -Id $job.id

    }

Jeśli zadanie nie zostało jeszcze ukończone, zostanie wyświetlony komunikat o stanie z odpowiednią informacją. Widać to poniżej:


else

    {

     "Zadanie $($job.id ) nie zakończyło jeszcze wykonywania zadania $($job.command)"

    }

Na koniec oczyszczamy kolejkę zadań, używając apletu polecenia Get-Job do pobrania wszystkich obiektów zadań i przesłania i potokiem do apletu polecenia Remove-Job. Parametr force jest potrzebny, aby usunąć wszelkie zadania, które mogą jeszcze nie być zakończone. W rzeczywistości nie zawsze będzie to korzystne, ale ma sens do celów demonstracyjnych. Może to być również przydatne, jeśli wskutek błędu programistycznego zdarzy się nam przypadkowo utworzyć zadania działające zbyt długo:

Get-Job | Remove-Job –force

Pełen skrypt UseJobsToGetProcessAndService.ps1 widać poniżej.

UseJobsToGetProcessAndService.ps1

Start-Job -Name process -ScriptBlock { Get-Process }

Start-Job -Name Service -ScriptBlock { Get-Service }

"Wstrzymanie na 3 sekundy..."

start-sleep -Seconds 3



Foreach ($job in Get-Job)

 {

  if($job.state -eq 'Completed')

    {

     "Odbieranie zadania o identyfikatorze $($job.id), które wykonuje polecenie $($job.command)`r`n"

     Start-Sleep -Seconds 1

     Receive-Job -Id $job.id

    }

  else

    {

     "Zadanie $($job.id ) nie zakończyło jeszcze wykonywania zadania $($job.command)"

    }

 }

 Get-Job | Remove-Job -force

Kiedy skrypt zostanie uruchomiony w oknie Windows PowerShell ISE, dane wyjściowe wyglądają tak, jak to widać poniżej. Użycie poleceń Start-Sleep pozwala zaobserwować pobieranie poszczególnych zadań. Okno danych wyjściowych trzeba uważnie obserwować, ale powinno dać się zauważyć wyświetlanie poszczególnych wartości job.id i job.command przez sekundę.

AG, to już wszystko, co trzeba wiedzieć o używaniu zadań w skrypcie. Jutro przedstawimy kolejny skrypt z serii poświęconej zadaniom programu Windows PowerShell.

Jeśli chcecie szybciej dowiadywać się, jakim tematom poświęcone będą kolejne artykuły, śledźcie nas w serwisie Twitter lub Facebook. W razie jakichkolwiek pytań piszcie do nas na adres scripter@microsoft.com lub publikujcie na oficjalnym forum skrypciarzy. Do zobaczenia jutro.

 Do początku strony Do początku strony

Centrum Skryptow - Systemy Operacyjne