Geek School Naučte sa používať pracovné miesta v PowerShell
PowerShell má štyri typy úloh - pracovné pozadie, pracovné miesta na diaľku, pracovné miesta WMI a naplánované úlohy. Pridajte sa k nám, keď zistíme, aké sú a ako ich môžeme použiť.
Nezabudnite si prečítať predchádzajúce články v sérii:
- Naučte sa ako automatizovať systém Windows pomocou nástroja PowerShell
- Naučiť sa používať Cmdlets v PowerShell
- Učenie o používaní objektov v systéme PowerShell
- Formátovanie učenia, filtrovanie a porovnávanie v systéme PowerShell
- Naučte sa používať Remoting v PowerShell
- Použitie PowerShell na získanie informácií o počítači
- Práca s kolekciami v systéme PowerShell
A zostávajte celú týždeň na zvyšok seriálu.
Pracovné pozadie
Až doteraz bolo všetko, čo som vám uviedlo v systéme PowerShell, synchrónne, čo znamená, že niečo napíšeme do shellu a nemôžeme robiť veľa, kým príkaz neskončí. Toto je miesto, kde sa nachádzajú pozadia. Ak chcete spustiť pozadie, úloha jednoducho odošlite blok skriptu do cmdletu Start-Job.
Start-úloha -Name GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Teraz máme slobodu robiť všetko, čo chceme v rámci shellu, zatiaľ čo blok skriptu sa spustí na pozadí.
Keď spustite novú úlohu, PowerShell vytvorí nový objekt úlohy, ktorý predstavuje danú úlohu. Všetky úlohy môžete kedykoľvek získať spustením cmdletu Get-Job.
Objekty úlohy vám hovoria o stave úloh. Napríklad na horeuvedenom obrázku môžeme vidieť, že máme BackgroundJob s názvom GetFileList, ktorý stále beží, ale už začal vracať dáta. Ak sa v ľubovoľnom bode rozhodnete, že úloha prebehla príliš dlho, môžete ju ľahko zastaviť tak, že ju vytlačíte do pozície Stop-Job.
Get-Job -Name GetFileList | Stop-Job
Ak však ukončíte prácu, akékoľvek údaje, ktoré získala až do okamihu, kedy ste ju zastavili, sú stále k dispozícii. Existuje však gotcha. V nástroji PowerShell, akonáhle získate výsledky pre úlohu, budú odstránené. Ak chcete, aby zostali, musíte určiť parameter udržiavacieho prepínača Receive-Job.
Get-Job -Name GetFileList | Prijímanie úloh
Keď skončíte prácou, najlepšie je odstrániť ju. Ak chcete úlohu odstrániť, jednoducho ju pretiahnite na cmdlet Odstrániť úlohu.
Get-Job -Name GetFileList | Remove-Job
Tým sa odstráni zo zoznamu úloh vrátených nástrojom Get-Job.
Vzdialené úlohy
Pred pár hodinami sme sa pozreli na to, ako môžeme použiť remoting na vykonanie príkazov PowerShell na vzdialenom počítači pomocou Invoke-Command, ale viete, že môžete použiť aj Invoke-Command na spustenie remoting úlohy na pozadí? Za týmto účelom jednoducho pridajte parameter -AsJob na koniec príkazu:
Invoke-Command -ComputerName Flash, Viper - Správca verzie -ScriptBlock gci -AsJob
To bol jednoduchý príkaz a mal by sa skončiť s vykonávaním, takže vám umožní pozrieť sa na náš stav práce.
Hmm, vyzerá to, že sa nepodarilo. To ma prináša do prvej gotchy s prácou. Keď vytvoríte novú úlohu akéhokoľvek druhu v PowerShell, vytvorí jednu úlohu rodiča okrem jednej úlohy pre každého počítača, na ktorom prácu vykonávate. Keď použijete cmdlet Get-Job, zobrazí sa len rodičovské úlohy a stav štátu je najhorší scenár, čo znamená, že aj keď sa príkaz nepodarilo spustiť na jednom zo sto počítačov, povedie stav rodičovských úloh zlyhalo. Ak chcete zobraziť zoznam podradených úloh, musíte použiť parameter IncludeChildJob.
Ak sa pozriete bližšie, uvidíte, že práca naozaj zlyhala iba v jednom počítači, čo nás privedie k ďalšej klapke. Keď sa pokúsite získať výsledky pre danú úlohu, ak zadáte názov alebo ID rodičovskej úlohy, PowerShell vráti údaje zo všetkých podradených úloh. Problém je v tom, že ak sa vyskytne chyba v jednej z podradených úloh, budeme mať nejaký červený text.
Existujú dva spôsoby, ako to dosiahnuť. Po prvé, ak viete, na aké počítače chcete dosiahnuť výsledky, jednoducho použite parameter ComputerName príkazu Recieve -Job cmdlet.
Get-Job-ID 3 | Receive-Job -Keep -ComputerName Viper
Alternatívne môžete získať výsledky z konkrétnej podriadenej úlohy pomocou čísla úlohy.
Get-Job -Id 3-ZahrnúťChildJob
Get-Job-Id 5 | Prijímanie úloh
Pracovné miesta WMI
Pracovné úlohy služby WMI sú v podstate rovnaké ako pracovné miesta na diaľku a vyžadujú sa pridanie iba parametra -AsJob do zväzku Get-WmiObject.
Bohužiaľ, to znamená, že sú tiež predmetom rovnakých gotchas, ktoré som spomenul v sekcii Vzdialené pracovné miesta.
Plánované úlohy
Posledné tri druhy pracovných miest, na ktoré sme sa pozreli, neboli pretrvávajúce, čo znamená, že sú k dispozícii len v rámci vašej aktuálnej relácie. V podstate to znamená, že ak odštartujete prácu a potom otvoríte inú PowerShell konzolu a spustite Get-Job, neuvidíte žiadne úlohy. Vráťte sa späť na konzolu, ktorú ste odhodili, budete môcť vidieť jej stav. Toto je na rozdiel od Plánovaných úloh, ktoré sú trvalé. Plánovaná úloha je v podstate skript bloku, ktorý beží podľa plánu. V minulosti by sa rovnaký vplyv mohol dosiahnuť pomocou Plánovača úloh systému Windows, čo je skutočne to, čo sa deje pod kapotou. Ak chcete vytvoriť novú naplánovanú úlohu, vykonáme nasledovné:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily -At 17:00) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
V tomto príkaze sa veľa veľa deje, tak to rozdelíme.
- Najprv uvádzame názov GetEventLogs na našu plánovanú prácu.
- Potom povieme, že keď sa spustí, chceme spustiť obsah určeného bloku skriptov, ktorý v zásade získa najnovších 100 záznamov denníka udalostí zabezpečenia.
- Ďalej zadáme spúšťač. Keďže parameter spúšťaču zaujme spúšťací objekt ako vstup, použili sme zátvorový príkaz na generovanie spúšťača, ktorý sa vypne každý deň o 5PM.
- Keďže sa zaoberáme denníkom udalostí, musíme bežať ako správca, ktorý môžeme špecifikovať vytvorením nového objektu ScheduledJobOption a jeho odovzdaním do parametra ScheduledJobOption.
Keďže ide o trochu iný typ úlohy, budete musieť použiť iný príkaz na získanie zoznamu všetkých plánovaných úloh na stroji.
Get-ScheduledJob
To je všetko pre to.