Geek School Naučte se používat práci v PowerShell
PowerShell má čtyři typy úloh - pracovní nabídky na pozadí, vzdálené úlohy, pracovní místa WMI a naplánované úlohy. Připojte se k nám, když zjistíme, jaké to jsou a jak je můžeme použít.
Ujistěte se, že jste si přečetli předchozí články v sérii:
- Naučte se automatizovat systém Windows pomocí nástroje PowerShell
- Naučte se používat Cmdlets v PowerShell
- Učení o používání objektů v prostředí PowerShell
- Formátování učení, filtrování a porovnávání v prostředí PowerShell
- Naučte se používat Remoting v PowerShell
- Použití funkce PowerShell pro získání informací o počítači
- Práce s kolekcemi v prostředí PowerShell
A zůstaňte v klidu po zbytek série celý týden.
Práce na pozadí
Až do teď bylo všechno, co jsem vám ukázal v PowerShellu, synchronní, což znamená, že do shellu něco napíšeme a nemůže to opravdu udělat, dokud tento příkaz nedokončí spuštění. Toto je místo, kde přijíždějí zálohy na pozadí. Chcete-li spustit pozadí, úloha jednoduše předá skript bloku do cmdletu Start-Job.
Start-úloha -Name GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Nyní můžeme dělat, co chceme v rámci shellu, zatímco tento blok skriptu se provádí na pozadí.
Při spuštění nové úlohy vytvoří PowerShell nový úkol úlohy, který představuje danou úlohu. Seznam všech úloh můžete kdykoli získat spuštěním rutiny Get-Job.
Objekty úlohy vás informují o stavu úloh. Například na výše uvedené obrazovce můžeme vidět, že máme BackgroundJob nazvaný GetFileList, který je stále spuštěn, ale již začal vracet data. Pokud se v jakémkoli okamžiku rozhodnete, že úloha trvá příliš dlouho, můžete ji snadno zastavit tak, že ji přivedete do Stop-Job.
Get-Job - jmenujme GetFileList | Stop-Job
Jakmile však ukončíte práci, budou veškeré údaje, které získala, až do okamžiku, kdy jste ji zastavili. Existuje však gotcha. V nástroji PowerShell, jakmile obdržíte výsledky úlohy, budou odstraněny. Aby mohly zůstat, musíte zadat parametr udržovací přepínač Receive-Job.
Get-Job - jmenujme GetFileList | Příjem-Údržba
Jakmile dokončíte práci, je nejlepší ji odstranit. Chcete-li úlohu odstranit, jednoduše ji přetáhněte na cmdlet Odstranit úlohu.
Get-Job - jmenujme GetFileList | Odstranit-Úloha
Tímto odstraníte ze seznamu úloh vrácených funkcí Get-Job.
Vzdálené úlohy
Před několika málo hodinami jsme se podívali na to, jak můžeme použít příkaz remoting pro spuštění příkazů PowerShell na vzdáleném počítači pomocí příkazu Invoke-Command, ale víte, že můžete také použít příkaz Invoke-Command k tomu, abyste spustili úlohu remoting na pozadí? Chcete-li tak učinit, stačí přidat parametr -AsJob na konec příkazu:
Invoke-Command -ComputerName Flash, Viper -Credential administrátor -ScriptBlock gci -AsJob
To byl jednoduchý příkaz, který by měl být dokončen již nyní, takže se můžete podívat na náš pracovní status.
Hmm, vypadá to, že se nezdařilo. To mě přivádí k mému prvnímu gotchu s prací. Při vytváření nové úlohy libovolného typu v PowerShell vytvoří jednu rodičovskou úlohu kromě jedné podřízené úlohy pro každý počítač, na kterém je úloha spuštěna. Když použijete cmdlet Get-Job, zobrazí pouze rodičovské úlohy a vlastnost státu je nejhorší scénář, což znamená, že i když se příkaz spustí pouze v jedné ze sto počítačů, selhalo. Chcete-li zobrazit seznam podřízených úloh, musíte použít parametr IncludeChildJob.
Pokud se podíváte blíž, uvidíte, že práce skutečně selhala pouze v jednom počítači, což nás přivádí k dalšímu chycení. Při pokusu o získání výsledků pro danou úlohu, pokud zadáte název úlohy rodiče nebo ID, systém PowerShell vrátí data ze všech podřízených úloh. Problémem je, že pokud došlo k chybě v jedné z podřízených úloh, budeme mít nějaký červený text.
Existují dva způsoby, jak se dostat kolem tohoto. Za prvé, pokud víte, na jaké počítače chcete výsledky, můžete jednoduše použít parametr ComputerName v příručce Recieve -Job cmdlet.
Get-Job -Id 3 | Receive-Job -Keep -ComputerName Viper
Případně můžete získat výsledky z určité podřízené úlohy pomocí čísla úlohy.
Get-Job-ID 3-ZahrnoutChildJob
Get-Job -Id 5 | Příjem-Údržba
Práce WMI
Úlohy služby WMI jsou stejné jako funkce Vzdálená pracoviště a vyžadují, aby byl do skriptu Get-WmiObject přidán pouze parametr -AsJob.
Bohužel to znamená, že jsou také předmětem stejného hesla, o kterém jsem se zmínil v sekci Vzdálené úlohy.
Plánované úlohy
Poslední tři druhy pracovních míst, na které jsme se zabývali, nebyly trvalé, což znamená, že jsou k dispozici pouze ve vaší aktuální relaci. V podstatě to znamená, že pokud spustíte práci a poté otevřete další PowerShell Console a spustit Get-Job, neuvidíte žádné úlohy. Vraťte se však zpět na konzolu, do které jste odkopala úlohu, a uvidíte její stav. To je v rozporu s Plánované úlohy, které jsou vytrvalé. Plánovaná úloha je v zásadě blokem skriptů, který běží podle plánu. V minulosti mohl být stejný vliv dosažen pomocí programu Windows Task Scheduler, což je skutečně to, co se děje pod kapotou. Chcete-li vytvořit novou naplánovanou úlohu, proveďte následující kroky:
Registrovat-NaplánovánoJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
V tom rozkazu se toho hodně děje, tak to rozbijeme.
- Nejprve uvedeme svou plánovanou práci název GetEventLogs.
- Poté řekneme, že když jsme spustili, chceme spustit obsah zadaného bloku skriptů, který v zásadě získává nejnovější 100 záznamů protokolu událostí zabezpečení.
- Dále zadáme spoušť. Vzhledem k tomu, že parametr spouštění vezme jako vstupní objekt spouštěcí objekt, použili jsme pro zadání příkazu závorka, který bude vypíná každý den při 5PM.
- Jelikož se zabýváme protokolem událostí, musíme běžet jako správce, který můžeme specifikovat vytvořením nového objektu ScheduledJobOption a jeho předáním parametru ScheduledJobOption.
Vzhledem k tomu, že se jedná o mírně odlišný typ úlohy, budete muset použít jiný příkaz k získání seznamu všech plánovaných úloh na stroji.
Get-ScheduledJob
To je vše, co je k tomu.