PowerShell ma cztery typy zadań - zadania w tle, zadania zdalne, zadania WMI i zadania zaplanowane. Dołącz do nas, gdy dowiemy się, czym one są i jak możemy z nich korzystać.
Przeczytaj poprzednie artykuły z serii:
- Dowiedz się, jak zautomatyzować system Windows za pomocą programu PowerShell
- Nauka korzystania z poleceń cmdlet w programie PowerShell
- Nauka używania obiektów w PowerShell
- Nauka formatowania, filtrowania i porównywania w PowerShell
- Naucz się korzystać z Remoting w PowerShell
- Korzystanie z programu PowerShell w celu uzyskania informacji o komputerze
- Praca z kolekcjami w PowerShell
I bądź na bieżąco z resztą serialu przez cały tydzień.
Zadania w tle
Do tej pory wszystko, co wam pokazałemPowerShell jest zsynchronizowany, co oznacza, że wpisujemy coś w powłoce i niewiele możemy zrobić, dopóki to polecenie nie zakończy się. W tym miejscu pojawiają się zadania w tle. Aby uruchomić tło, po prostu przekaż blok skryptu do polecenia cmdlet Start-Job.
Start-Job –Nazwa GetFileList –Scriptblock {Get-ChildItem C: –Recurse}
Teraz możemy robić wszystko, co chcemy w powłoce, podczas gdy ten blok skryptu działa w tle.
Po rozpoczęciu nowego zadania PowerShell tworzy nowy obiekt zadania, który reprezentuje to zadanie. Listę wszystkich zadań można uzyskać w dowolnym momencie, uruchamiając polecenie cmdlet Get-Job.
Obiekty zadania informują o statusieOferty pracy. Na przykład na powyższym zrzucie ekranu możemy zobaczyć, że mamy BackgroundJob o nazwie GetFileList, który wciąż działa, ale już zaczął zwracać dane. Jeśli w dowolnym momencie zdecydujesz, że zadanie działało zbyt długo, możesz łatwo je zatrzymać, przesyłając je do Stop-Job.
Get-Job –Nazwa GetFileList | Stop-Job
Jednak po zatrzymaniu pracy, cokolwiekdane, które otrzymał do momentu zatrzymania, są nadal dostępne. Jest jednak gotcha. W programie PowerShell wyniki otrzymane dla zadania są usuwane. Aby pozostały, musisz określić parametr przełącznika utrzymania dla Odbioru – Zadania.
Get-Job –Nazwa GetFileList | Receive-Job - Keep
Po zakończeniu pracy najlepiej jest ją usunąć. Aby usunąć zadanie, po prostu potokuj je do polecenia cmdlet Remove-Job.
Get-Job –Nazwa GetFileList | Usuń zadanie
Spowoduje to usunięcie go z listy zadań zwracanych przez Get-Job.
Zdalne prace
Kilka lekcji temu zastanawialiśmy się, jak możemy z tego skorzystaćzdalne uruchamianie poleceń PowerShell na zdalnym komputerze za pomocą Invoke-Command, ale czy wiesz, że możesz także użyć Invoke-Command, aby rozpocząć pracę zdalną w tle? Aby to zrobić, po prostu dodaj parametr –AsJob na końcu polecenia:
Invoke-Command -ComputerName Flash, Viper-Administrator poświadczeń -ScriptBlock {gci} –AsJob
To było proste polecenie i powinno już zostać zakończone, więc spójrzmy na status naszych zadań.
Hmm, wygląda na to, że się nie udało. To przenosi mnie do mojej pierwszej pracy z pracą. Podczas tworzenia nowego zadania dowolnego typu w programie PowerShell tworzy ono jedno zadanie nadrzędne oprócz jednego zadania podrzędnego dla każdego komputera, na którym jest uruchomione. Podczas używania polecenia cmdlet Get-Job pokazuje tylko zadania nadrzędne, a właściwość state jest najgorszym scenariuszem, co oznacza, że nawet jeśli polecenie nie uruchomi się tylko na jednym ze stu komputerów, stan zadań nadrzędnych powie: nie powiodło się Aby zobaczyć listę zadań podrzędnych, musisz użyć parametru IncludeChildJob.
Jeśli przyjrzysz się bliżej, zobaczysz, że zadanie się spełniłow rzeczywistości zawodzi tylko na jednym komputerze, co prowadzi nas do następnej gotcha. Gdy spróbujesz uzyskać wyniki zadania, jeśli podasz nazwę lub identyfikator zadania rodzica, PowerShell zwróci dane ze wszystkich zadań potomnych. Problem polega na tym, że jeśli wystąpił błąd w jednym z zadań podrzędnych, zostanie nam czerwony tekst.
Można to obejść na dwa sposoby. Po pierwsze, jeśli wiesz, dla jakich komputerów chcesz uzyskać wyniki, możesz po prostu użyć parametru ComputerName polecenia cmdlet Recieve –Job.
Get-Job –Id 3 | Odbierz-Job –Keep –ComputerName Viper
Alternatywnie można uzyskać wyniki z określonego zadania podrzędnego, używając jego identyfikatora zadania.
Get-Job -Id 3 –IncludeChildJob
Get-Job -Id 5 | Receive-Job - Keep
WMI Jobs
Zadania WMI są bardzo podobne do Zadań zdalnych, wymagając tylko dodania parametru –AsJob do polecenia cmdlet Get-WmiObject.
Niestety oznacza to, że podlegają one również tym samym problemom, o których wspomniałem w sekcji Zadania zdalne.
Zaplanowane prace
Ostatnie trzy rodzaje prac, na które spojrzeliśmynietrwałe, co oznacza, że są dostępne tylko w bieżącej sesji. Zasadniczo oznacza to, że jeśli uruchomisz zadanie, a następnie otworzysz inną konsolę PowerShell i uruchomisz Get-Job, nie zobaczysz żadnych zadań. Wróć jednak do konsoli, z której wykonałeś zadanie, będziesz mógł zobaczyć jego status. Jest to sprzeczne z zaplanowanymi zadaniami, które są trwałe. Zasadniczo Zaplanowane Zadanie jest blokiem skryptuktóry działa zgodnie z harmonogramem. W przeszłości ten sam efekt można było uzyskać za pomocą Harmonogramu zadań systemu Windows, który tak naprawdę dzieje się pod maską. Aby utworzyć nowe Zaplanowane zadanie, wykonujemy następujące czynności:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock {Get-EventLog -LogName Security -Newest 100} -Trigger (New-JobTrigger -Daily -At 17pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
W tym poleceniu dzieje się całkiem sporo, więc podzielmy to.
- Po pierwsze, nadajemy naszej Zaplanowanej Pracy nazwę GetEventLogs.
- Mówimy wtedy, że po uruchomieniu chcemy uruchomić zawartość określonego bloku skryptu, który w zasadzie pobiera 100 najnowszych wpisów w dzienniku zdarzeń bezpieczeństwa.
- Następnie określamy wyzwalacz. Ponieważ parametr wyzwalacza przyjmuje obiekt wyzwalający jako dane wejściowe, użyliśmy polecenia w nawiasie, aby wygenerować wyzwalacz, który będzie uruchamiał się codziennie o 17:00.
- Ponieważ mamy do czynienia z dziennikiem zdarzeń, musimy działać jako administrator, co możemy określić, tworząc nowy obiekt ScheduledJobOption i przekazując go do parametru ScheduledJobOption.
Ponieważ jest to nieco inny rodzaj zadania, konieczne będzie również użycie innego polecenia, aby pobrać listę wszystkich zaplanowanych zadań na komputerze.
Get-ScheduledJob
To wszystko.