Geek School Naučite se uporabljati delovna mesta v programu PowerShell
PowerShell ima štiri vrste opravil - opravila v ozadju, oddaljena opravila, opravila WMI in načrtovana opravila. Pridružite se nam, ko bomo izvedeli, kaj so in kako jih lahko uporabimo.
Preberite prejšnje članke v seriji:
- Naučite se avtomatizirati Windows s PowerShell
- Učenje uporabe ukaznih vrstic v PowerShell
- Učenje uporabe objektov v programu PowerShell
- Učenje oblikovanja, filtriranja in primerjave v programu PowerShell
- Naučite se uporabljati možnost Remoting v PowerShell
- Uporaba programa PowerShell za pridobivanje informacij o računalniku
- Delo z zbirkami v programu PowerShell
In ostanite z nami do konca tedna.
Ozadje delovnih mest
Do sedaj je bilo vse, kar sem vam pokazal v PowerShellu, sinhrono, kar pomeni, da nekaj vtipkamo v ukazno lupino in ne moremo narediti veliko, dokler se ta ukaz ne konča. Tukaj pridejo ozadja opravil. Če želite začeti ozadje, opravilo preprosto prenese blok skripta na zagonsko opravilo.
Start-Job-Ime GetFileList -Scriptblock Get-ChildItem C: \ t
Zdaj lahko v lupini naredimo vse, kar hočemo, medtem ko se blok izvajajo v ozadju.
Ko začnete novo opravilo, PowerShell ustvari nov predmet opravila, ki predstavlja to opravilo. Seznam vseh opravil lahko kadarkoli dobite, tako da zaženete ukazno vrstico Get-Job.
Objekti opravil vam govorijo o stanju opravil. Na primer, v zgornji sliki zaslona lahko vidimo, da imamo BackgroundJob, imenovan GetFileList, ki se še vedno izvaja, vendar je že začel vračati podatke. Če se na kateri koli točki odločite, da je delo potekalo predolgo, ga lahko preprosto zaustavite tako, da ga preusmerite v Stop-Job.
Get-Job-Ime GetFileList | Stop-Job
Vendar, ko ste prekinili delo, ne glede na podatke, ki ste jih prejeli, dokler ne prenehate, je še vedno na voljo. Vendar pa je prišlo do tega. V PowerShell, ko prejmete rezultate za opravilo, se izbrišejo. Če želite, da ostanejo, morate podati parameter preklopi stikalo za prejemanje.
Get-Job-Ime GetFileList | Receive-Job -Keep
Ko končate delo, je najbolje, da ga odstranite. Če želite odstraniti opravilo, ga preprosto preusmerite v cmdlet za odstranitev opravila.
Get-Job-Ime GetFileList | Odstrani-Job
To ga bo odstranilo s seznama opravil, ki jih vrne Get-Job.
Oddaljena opravila
Pred nekaj leti smo pregledali, kako lahko uporabimo oddaljene operacije za izvajanje ukazov PowerShell na oddaljenem računalniku z uporabo funkcije Invoke-Command, vendar ste vedeli, da lahko uporabite tudi ukaz Invoke-Command za zagon oddaljenega opravila v ozadju? V ta namen preprosto dodajte parameter -AsJob na konec vašega ukaza:
Invoke-Command -Ime računalnika Flash, Viper-poverilnega skrbnika -ScriptBlock gci -AsJob
To je bil preprost ukaz in do sedaj bi se moral končati, tako da si lahko ogledamo status naših delovnih mest.
Hmm, izgleda, da ni uspelo. To me je pripeljalo do prvega dela s službo. Ko v PowerShell ustvarite novo opravilo poljubne vrste, ustvari eno nadrejeno opravilo poleg enega otroka za vsak računalnik, pred katerim izvajate opravilo. Ko uporabite ukazno vrstico Get-Job, vam prikaže samo nadrejena opravila, lastnost stanja pa je najslabši možni scenarij, kar pomeni, da bo tudi, če se ukaz ne bo zagnal samo na eni od sto računalnikov, stanje nadrejenih opravil povedalo ni uspelo. Če želite videti seznam otroških opravil, morate uporabiti parameter IncludeChildJob.
Če pogledate bliže, boste videli, da je delo resnično neuspešno na enem računalniku, kar nas pripelje na naslednjo gotco. Ko poskusite dobiti rezultate za opravilo, če podate ime ali ID nadrejenega posla, bo PowerShell vrnil podatke iz vseh podrejenih opravil. Težava je v tem, da če je prišlo do napake v eni od otroških nalog, bomo imeli nekaj rdečega besedila.
Obstajata dva načina za to. Prvič, če veste, za katere računalnike želite rezultate, lahko preprosto uporabite parameter ComputerName v cmdletu Receive -Job.
Get-Job -Id 3 | Receive-Job -Keep -ComputerName Viper
Lahko pa dobite rezultate iz določenega podrejenega opravila z uporabo njegovega ID-ja opravila.
Get-Job -Id 3 -VključiDecaJob
Get-Job -Id 5 | Receive-Job -Keep
Zaposlitve WMI
Opravila WMI so skoraj enaka kot oddaljena opravila in zahtevajo dodajanje parametra -AsJob v ukazno vrstico Get-WmiObject..
Na žalost to pomeni, da so tudi predmet enakih dovoljenj, ki sem jih omenil v oddelku za oddaljena opravila.
Razporejena opravila
Zadnje tri vrste opravil, ki smo si jih ogledali, niso obstojne, kar pomeni, da so na voljo samo v trenutni seji. V bistvu to pomeni, da če začnete z delom in nato odprete drugo konzolo PowerShell in zaženete Get-Job, ne boste videli nobenih opravil. Vendar pa se vrnite na konzolo, iz katere ste odvrnili službo, lahko vidite njen status. To je v nasprotju z načrtovanimi delovnimi mesti, ki so obstojne. Načrtovano opravilo je v bistvu blok skripta, ki se izvaja po urniku. V preteklosti je bil enak učinek mogoče doseči s programom Windows Task Scheduler, ki se dejansko dogaja pod pokrovom. Če želite ustvariti novo razporejeno opravilo, naredimo naslednje:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily-At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
V tem ukazu se dogaja kar nekaj, zato ga razčlenimo.
- Prvič, našemu načrtovanemu delu dajemo ime GetEventLogs.
- Nato ji povemo, da želimo, da se ob sprožitvi zažene vsebina določenega bloka skript, ki v bistvu dobi najnovejših 100 vnosov dnevnika varnostnega dogodka.
- Nato določimo sprožilec. Ker parameter sprožilca kot vhod sproži prožilni objekt, smo za ustvarjanje sprožilca, ki se bo izklopil vsak dan ob 5:00, uporabili ukaz iz oklepaja..
- Ker se ukvarjamo z dnevnikom dogodkov, moramo delovati kot skrbnik, ki ga lahko določimo z ustvarjanjem novega objekta ScheduledJobOption in ga posredujemo parametru ScheduledJobOption..
Ker je to nekoliko drugačna vrsta opravila, boste morali uporabiti tudi drugačen ukaz za pridobitev seznama vseh načrtovanih opravil na računalniku.
Get-ScheduledJob
To je vse.