Centrum Skryptow - Systemy Operacyjne

Jak odebrać wszystkie zadania programu 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.

*

Jak odebrać wszystkie zadania programu Windows PowerShell?

Cześć, Skrypciarze! Podoba mi się koncepcja używania w skrypcie zadań programu Windows PowerShell. Problem polega na tym, że chcę uruchomić kilka zadań. Zależy mi na możliwości odczekania, aż wszystkie zadania zostaną ukończone, a następnie odebrania wszystkich jednocześnie. Czy to możliwe? Przeglądam aplety poleceń związane z zadaniami, ale nie widzę takiego, który umożliwiałby odebranie wszystkich ukończonych zadań. Jeśli to niemożliwe, jakoś sobie dam radę, ale zawsze warto spytać.

— KB

Cześć, KB!

Czołem, tutaj skrypciarz Ed Wilson. Ten tydzień w Charlotte był bardzo spokojny. Nie padał śnieg, nie było burz, tylko trochę mgły i popołudniowe mżawki. Mżawki rzecz jasna padały w dniu, kiedy jechałem do centrum, żeby spotkać się z menedżerem klienta firmy Microsoft, który kupił kilka moich książek „Windows PowerShell 2.0 Best Practices” dla swoich klientów. Rozdawania autografów było dla mnie idealnym pretekstem, aby ruszyć się z domu. W biurze firmy Microsoft w Charlotte podoba mi się to, że zawsze wpadam na znajomych. To był świetny dzień — mimo opadów.

Między spotkaniami ze znajomymi i popijaniem herbaty w Twardym Dysku (tak się nazywa nasza kawiarnia) udało mi się zajrzeć na skrzynkę pocztową scripter@microsoft.com. KB, pamiętam, że James, jeden z inżynierów testowych z zespołu Windows PowerShell, napisał podobny skrypt, który dostosowałem do Twoich potrzeb.

Skrypt ReceiveArrayOfJobs.ps1 zaczyna się od utworzenia pustej tablicy o nazwie $arrayJobs. Następnie dodaję do tablicy trzy zadania. Pierwsze z nich to polecenie Get-Service; drugie to polecenie Get-Process, wstrzymujące na chwilę wykonanie. Następnie dodaję do tablicy fałszywe polecenie WMI. Nie istnieje klasa WMI o nazwie Win32_sofware (tak więc polecenie to wygeneruje błąd i służy do zilustrowania obsługi przez skrypt zadań, które kończą się błędem). Odpowiada za to następująca sekcja skryptu:

$arrayJobs = @()

$arrayJobs += Start-Job { Get-Service }

$arrayJobs += Start-Job { Get-Process ; Start-Sleep -Seconds 1}

$arrayJobs += Start-Job { Get-wmiObject win32_sofware }

W rzeczywistości prawdopodobnie uruchamialibyśmy zadania na komputerach zdalnych. Ponadto prawdopodobnie nie wpisalibyśmy bezpośrednio zadań, które chcemy wykonać. Lepszym rozwiązaniem byłoby odczytanie pliku tekstowego zawierającego listę zadań lub użycie innej metody pozwalającej uniknąć bezpośredniego wpisania wartości. Tak więc przed wdrożeniem tego skryptu w sieci warto zmodyfikować tę jego sekcję.

Po utworzeniu tablicy zadań możemy monitorować zadania, sprawdzając, czy zostały ukończone. Aby to zrobić, zaczynamy od przypisania wartości $false do zmiennej $complete. Zmienna $complete posłuży do stwierdzenia, że zadania zostały ukończone. Widać to poniżej:

$complete = $false

Kiedy zmienna $complete nie będzie ma wartości $true (tzn. przed ukończeniem), skrypt ReceiveArrayOfJobs.ps1 script sprawdza w tablicy zadań, czy mają one stan „running”. Test while widać poniżej:

while (-not $complete) {

Jeśli zadanie ciągle działa, oznacza to, że tablica nie została ukończona. Aby sprawdzić stan tablicy zadań, zmienna $arrayJobs jest przesyłana potokiem do apletu polecenia Where-Object. W obrębie apletu polecenia Where-Object sprawdzamy, czy właściwość state bieżącego obiektu jest równa ciągowi znaków „running”. W razie znalezienia dopasowania zostaje ono przypisane zmiennej $arrayJobsInProgress. Jest to powtarzane tak długo, jak długo znajdowane są dopasowania właściwości state. Odpowiada za to następująca sekcja skryptu:

$arrayJobsInProgress = $arrayJobs | 

        Where-Object { $_.State -match 'running' }

Jeśli nie ma zadań o stanie running, zmiennej $arrayJobsInProgress nie zostanie przypisana wartość. W konsoli programu Windows PowerShell jest wyświetlany ciąg znaków „Wszystkie zadania zostały ukończone”, a zmienna $complete otrzymuje wartość $true. Spowoduje to zakończenie pętli While, ponieważ działa ona jedynie, jeśli zmienna $complete ma wartość $false. Odpowiada za to następująca sekcja skryptu:

if (-not $arrayJobsInProgress) { "Wszystkie zadania zostały ukończone" ; $complete = $true }

Po wyjściu z pętli While zadania programu Windows PowerShell przechowywane w zmiennej $arrayJobs są przesyłane potokiem do apletu polecenia Receive-Job, a wyniki wszystkich zadań są wyświetlane w konsoli programu Windows PowerShell. Pełen skrypt ReceiveArrayOfJobs.ps1 widać poniżej.

ReceiveArrayOfJobs.ps1

$arrayJobs = @()

$arrayJobs += Start-Job { Get-Service }

$arrayJobs += Start-Job { Get-Process ; Start-Sleep -Seconds 1}

$arrayJobs += Start-Job { Get-wmiObject win32_sofware }





$complete = $false

while (-not $complete) {

    $arrayJobsInProgress = $arrayJobs | 

        Where-Object { $_.State -match 'running' }

    if (-not $arrayJobsInProgress) { "Wszystkie zadania zostały ukończone" ; $complete = $true } 

}



$arrayJobs | Receive-Job

Kiedy skrypt ReceiveArrayOfJobs.ps1 zostanie uruchomiony w oknie Windows PowerShell ISE, dane wyjściowe wyglądają tak, jak to widać poniżej.

KB, to już wszystko, co trzeba wiedzieć o odbieraniu wszystkich zadań programu Windows PowerShell. To już ostatni artykuł z serii poświęconej zadaniom programu Windows PowerShell. Jutro po raz kolejny zanurzymy się w skrzynce pocztowej, aby odpowiedzieć na pytania niewymagające długich wyjaśnień. Tak! Nadchodzi znów najbardziej emocjonujący moment w życiu każdego skrypciarza: szybki piątek!

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