29Aug
PowerShell má štyri typy úloh - pracovné pozadia, pracovné miesta na diaľku, pracovné miesta WMI a naplánované úlohy. Pridajte sa k nám, keď zisťujeme, akí sú a ako ich môžeme použiť.
Prečítajte si predchádzajúce články v sérii:
- Naučte sa automatizovať systém Windows so systémom PowerShell
- Naučiť sa používať kódy v PowerShell
- Učíme sa používať objekty vo formáte PowerShell
- Formovanie, filtrovanie a porovnávanie učení v PowerShell
- Naučte sa používať Remoting inPowerShell
- Použitie modulu PowerShell na získanie informácií o počítači
- Práca s kolekciami v PowerShell
A zostaňte celú týždeň na zvyšok série. Pracovné pozadie
Doteraz bolo všetko, čo som vám uviedlo v systéme PowerShell, synchrónne, čo znamená, že do konzoly píšeme niečo a nemôžeme robiť veľa, kým príkaz neskončí.Toto je miesto, kde prídu pozadie úloh. Ak chcete spustiť pozadie, úloha jednoducho odovzdať blok skriptu do cmdlet Štart-úloha.
Štartovacia úloha -Name GetFileList -Scriptblock{ Get-ChildItem C: \ -Recurse}
Teraz máme slobodu robiť, čo chceme, v rámci shellu, kým sa tento blok skriptov vykoná na pozadí.
Keď začnete novú úlohu, PowerShell vytvorí nový objekt úlohy, ktorý predstavuje túto ú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 na pozadí pozývame 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 Stop-Job.
Get-Job -Name GetFileList |Zastavenie úlohy
Keď však zastavíte prácu, akékoľvek údaje, ktoré získala až do bodu, kedy ste ju zastavili, sú stále k dispozícii. K dispozícii je však gotcha. V nástroji PowerShell, akonáhle získate výsledky pre úlohu, budú odstránené.Na to, aby zostali, musíte určiť parameter udržiavacieho prepínača Receive-Job.
Get-Job -Name GetFileList |Prijímanie úloh
Po dokončení práce je najlepšie zrušiť.Ak chcete úlohu odstrániť, jednoducho ju odskrutkujte na cmdlet Odstrániť úlohu.
Get-Job -Name GetFileList |Remove-Job
Toto odstráni zo zoznamu úloh, ktoré vráti Get-Job.
Remote Jobs
Pred niekoľkými ponaučkami 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í?Ak to chcete urobiť, jednoducho pridajte parameter -AsJob na koniec príkazu:
Invoke-Command -ComputerName Flash, Viper -Credential administrátor -ScriptBlock{ gci} -AsJob
To bol jednoduchý príkaz a mal by byť dokončený tak,umožňuje pozrieť sa na náš stav práce.
Hmm, vyzerá to, že sa nepodarilo. To ma prináša do prvej gotchy s prácou. Pri vytváraní novej úlohy akéhokoľvek druhu v systéme PowerShell vytvorí jednu nadradenú úlohu okrem jednej úlohy pre každého počítača, na ktorom prácu vykonávate. Keď použijete cmdlet Get-Job, zobrazí sa iba rodičovské úlohy a stav štátu je najhorší scenár, čo znamená, že aj keď sa príkaz nepodarilo spustiť iba na jednom zo sto počítačov, povedie stav materských úlohzlyhalo. 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 len v jednom počítači, čo nás privedie do ďalšieho getcha. Keď sa pokúsite získať výsledky úlohy, 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 došlo k chybe v jednej z podradených úloh, budeme mať nejaký červený text.
Existujú dva spôsoby, ako sa dostať okolo tohto. Po prvé, ak viete, na ktorých počítačoch chcete dosiahnuť výsledky, jednoducho použite parameter ComputerName pre rýpadlo Receive -Job.
Get-Job-Id 3 |Receive-Job -Keep -ComputerName Viper
Prípadne môžete získať výsledky z konkrétnej podriadenej úlohy pomocou jej ID úlohy.
Get-Job-ID 3-ZahrnúťChildJob
Get-Job -Id 5 |Príjem úlohy
WMI
Pracovné úlohyWMI sú v podstate rovnaké ako pracovné miesta na diaľku a vyžadujú sa, aby sa do rozbaľovacej ponuky Get-WmiObject pridal parameter -AsJob.
Bohužiaľ, to znamená, že sú tiež predmetom rovnakých gotchas som spomenul v sekcii vzdialené pracovné miesta. Plánované úlohy
Posledné tri druhy pracovných úloh, ktoré sme skúmali, neboli pretrvávajúce, čo znamená, že sú k dispozícii iba v aktuálnej relácii. 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, na ktorú ste odhodili úlohu, budete môcť vidieť jej stav. To je na rozdiel od Plánovaných úloh, ktoré sú perzistentné .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 zadáme našu plánovanú prácu názov GetEventLogs.
- Potom povieme, že po spustení chceme spustiť obsah zadané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 parametr spúšťania zaberá ako vstup spúšťací objekt, použili sme zátvorový príkaz na generovanie spúšťača, ktorý bude vypínať každý deň o 5:00.
- Keďže ide o protokol 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, čo je k nemu.