29Aug

Geek School: Naucz się 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ć.

Przeczytaj poprzednie artykuły z serii:

  • Dowiedz się, jak zautomatyzować system Windows za pomocą programu PowerShell
  • Nauka korzystania z poleceń Cmdlets w programie PowerShell
  • Nauka korzystania z obiektów w programie PowerShell
  • Nauka formatowania, filtrowania i porównywania w programie PowerShell
  • Naucz się korzystać z usługi Remoting wPowerShell
  • Używanie PowerShell do uzyskiwania informacji o komputerze
  • Praca z kolekcjami w programie PowerShell

Pozostańcie czujni przez resztę serii przez cały tydzień.

Prace w tle

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 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 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 zadania wszystkie 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 |Receive-Job -Keep

Po zakończeniu pracy najlepiej jest 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.

Praca zdalna

Kilka lekcji temu przyjrzeliśmy się sposobowi, w jaki możemy używać zdalnego wywoływania do wykonywania poleceń PowerShell na zdalnym komputerze za pomocą polecenia Invoke-Command, ale czy wiesz, że możesz także użyć polecenia wektoryzacji, aby uruchomić zdalne zadanie w tle? Aby to zrobić, po prostu dodaj parametr -AsJob na końcu twojego polecenia:

Invoke-Command - nazwa_komputera Flash, Viper - administrator_redytacyjny -ScriptBlock{ gci} -AsJob

To było proste polecenie i powinno już zostać zakończone.pozwala spojrzeć na nasz status 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.

Istnieją dwa sposoby obejścia tego problemu. 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-ComputerName 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 |Receive-Job -Keep

WMI Jobs

Zadania WMI

są w dużym stopniu 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 zadań, które przeglądaliśmy, nie były trwałe, co oznacza, że ​​są dostępne tylko w bieżącej sesji. Zasadniczo oznacza to, że jeśli uruchamiasz zadanie, a następnie otwierasz kolejną konsolę PowerShell i uruchamiasz program Get-Job, nie zobaczysz żadnych zadań.Wróć jednak do konsoli, z której wykopałeś zadanie, aby zobaczyć jego status. Jest to sprzeczne z Zaplanowanymi Zleceniami, 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.

  • Najpierw przydzielamy naszemu Zaplanowanemu zadaniu 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 uruchomić go 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, konieczne będzie również użycie innego polecenia w celu pobrania listy wszystkich zaplanowanych zadań na komputerze.

Get-ScheduledJob

To wszystko.