Geek School Dowiedz się, jak używać zadań w PowerShell
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ć.
Zapoznaj się z poprzednimi artykułami z serii:
- Dowiedz się, jak zautomatyzować system Windows za pomocą programu PowerShell
- Nauka korzystania z poleceń cmdlet w PowerShell
- Nauka korzystania z obiektów w PowerShell
- Nauka formatowania, filtrowania i porównywania w PowerShell
- Naucz się korzystać z Remotingu w PowerShell
- Korzystanie z PowerShell w celu uzyskania informacji o komputerze
- Praca z kolekcjami w PowerShell
I pozostańcie czujni przez resztę serii przez cały tydzień.
Zadania w tle
Do tej pory wszystko, co pokazałem ci w PowerShell, było synchroniczne, co oznacza, że wpisujemy coś do powłoki i naprawdę nie możemy zrobić zbyt wiele, dopóki polecenie to nie zostanie wykonane. To jest miejsce, w którym pojawiają się zadania w tle. Aby rozpocząć tło, zadanie po prostu przekazuje blok 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 działa w tle.
Po uruchomieniu nowego zadania PowerShell tworzy nowy obiekt zadania, który reprezentuje to zadanie. Możesz uzyskać listę wszystkich zadań w dowolnym momencie, uruchamiając polecenie cmdlet Get-Job.
Obiekty zadań informują o statusie zadań. Na przykład na powyższym zrzucie widzimy, że mamy BackgroundJob o nazwie GetFileList, który wciąż działa, ale już zaczął 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. Ale jest gówniarz. 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 | Odbierz-Zadanie -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ń zwracanych przez Get-Job.
Zadania zdalne
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ła prosta komenda i powinna już zostać zakończona, 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 zadań nadrzędnych będzie oznaczał 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 na jednym komputerze, co doprowadziło nas do następnego trafienia. Gdy 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
Alternatywnie, możesz uzyskać wyniki z określonego zadania podrzędnego, używając jego identyfikatora zadania.
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 | Odbierz-Zadanie -Trzymaj
Praca WMI
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".
Zaplanowane zadania
Ostatnie trzy rodzaje 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ń. Jednak wróć do konsoli, z której wykopałeś zadanie, będzie mógł zobaczyć jego status. Jest to przeciwieństwo Zaplanowanych zadań, które są trwałe. Zasadniczo Zaplanowane zadanie jest blokiem skryptów 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.
- Po pierwsze, nadajemy naszej Zaplanowanej pracy nazwę GetEventLogs.
- Następnie mówimy, że po uruchomieniu chcemy, aby uruchomiła zawartość określonego bloku skryptu, który zasadniczo otrzymuje najnowsze 100 wpisów dziennika zdarzeń Security.
- Następnie określamy wyzwalacz. Ponieważ parametr wyzwalacza przyjmuje obiekt wyzwalacza jako dane wejściowe, użyliśmy komendy parentetycznej do wygenerowania wyzwalacza, który będzie uruchamiany codziennie o godzinie 17:00.
- Ponieważ mamy do czynienia z dziennikiem zdarzeń, musimy działać jako administrator, który możemy określić, tworząc nowy obiekt ScheduledJobOption i przekazując go do parametru ScheduledJobOption.
Ponieważ jest to nieco inny typ zadania, musisz również użyć innego polecenia, aby pobrać listę wszystkich zaplanowanych zadań na komputerze.
Get-ScheduledJob
To wszystko.