PowerShell ima četiri vrste poslova - Pozadinski poslovi, daljinski poslovi, WMI poslovi i planirani poslovi. Pridružite nam se dok saznamo što jesu i kako ih možemo koristiti.
Obavezno pročitajte prethodne članke serije:
I ostanite u tijeku cijele serije cijeli tjedan.
Do sada sve što sam vam pokazao u PowerShellu bio je sinkroniziran, što znači da upisujemo nešto u ljusku i stvarno ne možemo puno učiniti sve dok naredba ne završi. Tu dolaze pozadinski poslovi. Za početak pozadine posao jednostavno prolazi skriptni blok u cmdlet Start-Job.
Početak-posao -Name GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Sad možemo slobodno raditi sve što želimo unutar ljuske dok taj blok skripta izvodi u pozadini.
Kada pokrenete novi posao, PowerShell stvara novi posao koji predstavlja taj posao. Popis svih poslova možete dobiti u bilo kojem trenutku pokretanjem cmdeta Get-Job.
Objekti posla vam govore o statusu posla. Na primjer, u gore opisanom snimku zaslona vidimo da imamo BackgroundJob zvan GetFileList koji je još uvijek pokrenut, ali je već počeo vraćati podatke. Ako u bilo kojem trenutku odlučite da posao već traje, možete ga jednostavno zaustaviti cijevima u Stop-Job.
Get-Job-naziv GetFileList | Stop-Posao
Međutim, nakon što prestanete s poslom, sve podatke koji ste primili sve dok to mjesto koje ste ga zaustavili još uvijek nije dostupno. Ima je gotcha. U PowerShellu, kada dobijete rezultate za posao, oni se brišu. Da bi oni ostali, morate navesti parametar čuvati prekidač primatelja.
Get-Job-naziv GetFileList | Primanje-Posao -Keep
Kada završite s poslom, najbolje je ukloniti ga. Da biste uklonili posao, jednostavno ga cijepite cmdlet Remove-Job.
Get-Job-naziv GetFileList | Uklonite-Posao
To će je ukloniti s popisa poslova koje dobije Get-Job.
Prije nekoliko sati smo pogledali kako možemo koristiti remotiranje za izvršavanje naredbi PowerShell na udaljenom računalu koristeći Invoke-Command, ali jeste li znali da možete koristiti Invoke-Command da započnete remoting posao u pozadini? Da biste to učinili, jednostavno dodajte parametar -AsJob na kraj naredbe:
Invoke-Command -ComputerName Flash, Viper -Prijenosnik administratora -ScriptBlock gci -AsJob
To je bila jednostavna naredba i trebala je dovršiti izvršenje do sada, tako da pogledamo naš status posla.
Hmm, izgleda da nije uspjelo. Ovo me dovodi na moju prvu kućicu s poslovima. Kada stvorite novi posao bilo koje vrste u PowerShellu, on stvara jedan roditeljski posao uz jedno dijete za svako računalo na kojem radite. Kada koristite cmdlet Get-Job, prikazuje se samo glavni poslovi, a stanje državnog vlasništva je najgori scenarij, što znači da čak i ako se naredba nije uspjela izvoditi samo na jedan od stotinu računala, država roditeljskih poslova reći će neuspjeh. Da biste vidjeli popis dječjih poslova, morate upotrijebiti parametar IncludeChildJob.
Ako pogledate bliže, vidjet ćete da je posao doista propustio samo na jednom računalu, što nas dovodi na sljedeću gothu. Kada pokušate dobiti rezultate za posao, ako navedete ime ili ID radnog mjesta roditelja, PowerShell će vratiti podatke sa svih dječjih poslova. Problem je u tome što ako je došlo do pogreške u jednom od dječjih poslova, bit ćemo ostavljeni s nekim crvenim tekstom.
Postoje dva načina zaokretanja. Prvo, ako znate koja računala želite rezultate, možete jednostavno upotrijebiti parametar ComputerName od Recieve -Job cmdlet.
Get-Job -Id 3 | Primanje-Posao -Keep -KomputerName Vipera
Alternativno, rezultate dobivene od određenog dječjeg posla možete dobiti koristeći svoj ID radnog mjesta.
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 | Primanje-Posao -Keep
WMI poslovi mnogo su isti kao i udaljeni poslovi, pri čemu je potreban samo parametar -AsJob koji se dodaje cmdletu Get-WmiObject.
Nažalost, to znači da oni također podliježu istim skupinama koje sam spomenuo u odjeljku Udaljeni poslovi.
Posljednje tri vrste poslova koje smo gledali nisu bile uporni, što znači da su dostupne samo u trenutačnoj sesiji. Uglavnom, to znači da ako započnete posao, a zatim otvorite drugu PowerShell konzolu i pokrenete Get-Job, nećete vidjeti nikakve poslove. Međutim, vratite se na konzolu s kojeg ste isključili posao, moći ćete vidjeti njegov status. Ovo je za razliku od zakazanih radnih mjesta koja su ustrajni, U osnovi, zakazani posao je blok skripte koji radi na rasporedu. U prošlosti, isti utjecaj mogao je postići pomoću Windows Task Scheduler, što je zapravo ono što se događa ispod nape. Za izradu novog zakazanog posla učinit ćemo sljedeće:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily -A 17) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
Dosta se toga događa u toj zapovijedi pa ćemo ga slomiti.
Budući da je riječ o neznatno različitoj vrsti posla, morat ćete upotrijebiti i drugu naredbu za pronalaženje popisa svih zakazanih zadataka na stroju.
Get-ScheduledJob
To je sve.