PowerShell ma cztery typy zadań - Zadania w tle, Zadania zdalne, Zadania WMI i Zaplanowane zadania. Dołącz do nas, gdy dowiemy się, co to jest i jak możemy z nich korzystać.
Przeczytaj poprzednie artykuły z serii:
I pozostańcie czujni przez resztę serii przez cały tydzień.
Do tej pory wszystko, co pokazałem ci w PowerShell, było synchroniczne, co oznacza, że wpisujemy coś do powłoki i nie możemy zrobić zbyt wiele, dopóki polecenie to nie zostanie wykonane. W tym miejscu pojawiają się zadania w tle. Aby rozpocząć pracę w tle, zadanie należy po prostu przekazać blokowi skryptu do polecenia cmdlet Start-Job.
Start-Job -Name GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Teraz możemy swobodnie robić, co chcemy w powłoce, podczas gdy ten blok skryptu jest wykonywany w tle.
Po uruchomieniu 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 zadań informują o statusie zadań. Na przykład na powyższym zrzucie ekranu widzimy, że mamy usługę BackgroundJob o nazwie GetFileList, która wciąż działa, ale już zaczęła zwracać dane. Jeśli w dowolnym momencie zdecydujesz, że zadanie jest uruchomione zbyt długo, możesz je łatwo zatrzymać, przepuszczając je do Stop-Job.
Get-Job -Name GetFileList | Zatrzymaj zadanie
Jednak po zatrzymaniu pracy, wszelkie dane, które otrzymały do momentu zatrzymania, są nadal dostępne. Jest jednak gafa. W PowerShell po otrzymaniu wyników dla zadania zostają one usunięte. Aby je pozostawić, musisz określić parametr przełącznika "Odbierz zadanie".
Get-Job -Name GetFileList | Odbieranie-praca -Trzymaj
Po zakończeniu pracy najlepiej ją usunąć. Aby usunąć zadanie, po prostu przeprowadź je do polecenia cmdlet Remove-Job.
Get-Job -Name GetFileList | Usuń zadanie
Spowoduje to usunięcie go z listy zadań zwróconych przez Get-Job.
Kilka lekcji temu przyjrzeliśmy się sposobowi, w jaki możemy używać zdalnego dostępu do wykonywania poleceń PowerShell na zdalnym komputerze za pomocą polecenia Invoke-Command, ale czy wiesz, że możesz także użyć polecenia Invoke-Command, aby uruchomić zdalną pracę w tle? Aby to zrobić, po prostu dodaj parametr -AsJob na końcu polecenia:
Invoke-Command-ComputerName Flash, Viper -Credential-administratorBlock gci -AsJob
To było proste polecenie i powinno już zostać zakończone, więc przyjrzyjmy się naszemu statusowi pracy.
Hmm, wygląda na to, że się nie udało. To sprawia, że zaczynam pracę. Podczas tworzenia nowego zadania dowolnego typu w PowerShell tworzy jedno zadanie nadrzędne oprócz jednego zadania podrzędnego dla każdego komputera, na którym działa zadanie. Gdy używasz polecenia cmdlet Get-Job, pokazuje tylko zadania nadrzędne, a właściwość stanu jest najgorszym scenariuszem, co oznacza, że nawet jeśli polecenie nie działa tylko na jednym ze stu komputerów, stan nadrzędnych zadań powie: nie udało się. Aby wyświetlić listę zadań podrzędnych, należy użyć parametru IncludeChildJob.
Jeśli przyjrzysz się bliżej, zobaczysz, że zadanie rzeczywiście zawiodło tylko na jednym komputerze, co doprowadziło nas do następnego trafienia. Kiedy próbujesz uzyskać wyniki dla zadania, jeśli podasz nazwę lub identyfikator zadania rodzica, PowerShell zwróci dane ze wszystkich zadań podrzędnych. Problem polega na tym, że jeśli wystąpił błąd w jednym z zadań podrzędnych, pozostanie nam trochę czerwonego tekstu.
Są dwa sposoby na obejście tego. Po pierwsze, jeśli wiesz, na jakie komputery chcesz uzyskać wyniki, możesz po prostu użyć parametru ComputerName polecenia cmdlet Recieve -Job.
Get-Job -Id 3 | Receive-Job-Kee - Nazwa komputera Viper
Możesz również uzyskać wyniki z określonego zadania podrzędnego, używając jego identyfikatora zadania.
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 | Odbieranie-praca -Trzymaj
Zadania WMI są takie same jak zadania zdalne, wymagające dodania tylko parametru -AsJob do polecenia cmdlet Get-WmiObject.
Niestety oznacza to, że są one również przedmiotem tych samych gier, o których wspomniałem w sekcji "Zadania zdalne".
Trzy ostatnie typy zleceń, które rozpatrywaliśmy, nie były trwałe, co oznacza, że są dostępne tylko w bieżącej sesji. Zasadniczo oznacza to, że jeśli uruchomisz zadanie, a następnie otworzysz kolejną konsolę PowerShell i uruchomisz zadanie Pobierz, nie zobaczysz żadnych zadań. Wróć jednak do konsoli, z której wykopałeś zadanie, aby zobaczyć jego status. Jest to przeciwieństwo Zaplanowanych zadań, które są trwałe. Zasadniczo Zaplanowane zadanie jest blokiem skryptu uruchamianym według harmonogramu. W przeszłości ten sam efekt mógł zostać osiągnięty za pomocą Windows Task Scheduler, który tak naprawdę dzieje się pod maską. Aby utworzyć nowe Zaplanowane zadanie, wykonaj następujące czynności:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
W tym poleceniu dzieje się całkiem sporo, więc zróbmy to.
Ponieważ jest to nieco inny typ zadania, konieczne będzie również użycie innego polecenia w celu pobrania listy wszystkich zaplanowanych zadań na komputerze.
Get-ScheduledJob
To wszystko.