Geek School Lær at bruge Jobs i PowerShell
PowerShell har fire typer job - Baggrund Jobs, Remote Jobs, WMI Jobs og Planlagte Jobs. Kom med os, da vi finder ud af, hvad de er, og hvordan vi kan bruge dem.
Sørg for at læse de tidligere artikler i serien:
- Lær at automatisere Windows med PowerShell
- Lære at bruge Cmdlets i PowerShell
- Lære at bruge objekter i PowerShell
- Learning Formatering, filtrering og sammenligning i PowerShell
- Lær at bruge fjernelse i PowerShell
- Brug af PowerShell til at få computeroplysninger
- Arbejder med samlinger i PowerShell
Og hold dig indstillet til resten af serien hele ugen.
Baggrund Jobs
Indtil nu har alt, hvad jeg har vist dig inden for PowerShell, været synkront, hvilket betyder at vi skriver noget ind i skallen og ikke rigtig gør meget, før kommandoen er færdig. Det er her, hvor baggrundsopgaver kommer ind. For at starte en baggrund, skal jobbet blot sende en scriptblok til start-job-cmdlet.
Start-Job-Navn GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Nu er vi fri til at gøre hvad vi vil inden for skallen, mens den scriptblok kører i baggrunden.
Når du starter et nyt job, opretter PowerShell et nyt jobobjekt, der repræsenterer det pågældende job. Du kan til enhver tid få en liste over alle job ved at køre cmdlet Get-Job.
Jobobjektene fortæller dig om status for jobene. For eksempel kan vi i ovenstående skærmbillede se, at vi har en BackgroundJob kaldet GetFileList, som stadig kører, men er allerede begyndt at returnere data. Hvis du på et hvilket som helst tidspunkt beslutter dig for, at jobbet har kørt for længe, kan du nemt stoppe det ved at røre det til Stop-Job.
Get-Job-Name GetFileList | Stop-job
Men når du har stoppet et job, er det stadig muligt, hvilke data den har modtaget indtil det punkt, du stoppede det. Der er dog en gotcha. I PowerShell, når du modtager resultaterne for et job, bliver de slettet. For at de skal forblive, skal du angive parameteren for holdekontakt for modtag-job.
Get-Job-Name GetFileList | Modtag-Job -Keep
Når du er færdig med et job, er det bedste praksis at fjerne det. For at fjerne jobbet skal du blot rør det til cmdlet Fjern-job.
Get-Job-Name GetFileList | Fjern-job
Dette fjerner det fra listen over job, der returneres af Get-Job.
Fjernopgaver
For nogle få lektioner siden så vi på, hvordan vi kan bruge fjernbetjening til at udføre PowerShell-kommandoer på en ekstern maskine ved hjælp af Invoke-Command, men vidste du, at du også kan bruge Invoke-Command til at starte et fjernbetjening i baggrunden? For at gøre det skal du blot tilføje parameteren -AsJob på slutningen af din kommando:
Invoke-Command -ComputerName Flash, Viper -Credential administrator -ScriptBlock gci -AsJob
Det var en simpel kommando og skulle have afsluttet at gennemføre nu, så lad os se på vores jobstatus.
Hmm, det ligner det mislykkedes. Dette bringer mig til min første gotcha med job. Når du opretter et nyt job af en hvilken som helst type i PowerShell, opretter det et forældrejob ud over et børnejob for hver computer, som du kører jobbet imod. Når du bruger Get-Job-cmdlet, vises det kun de overordnede job, og statsejendommen er worst case scenario, hvilket betyder, at selvom kommandoen ikke kan køre på en ud af hundrede computere, vil den overordnede jobstat sige mislykkedes. For at se en liste over børnejobs skal du bruge IncludeChildJob-parameteren.
Hvis du ser nærmere, vil du se, at jobbet faktisk kun svigtede på en computer, hvilket bringer os til den næste gotcha. Når du forsøger at få resultaterne til jobbet, vil PowerShell returnere dataene fra alle børnejobs, hvis du angiver forældrenes jobnavn eller ID. Problemet er, at hvis der er en fejl i et af børnejobene, vil vi blive efterladt med en eller anden rød tekst.
Der er to måder at komme rundt på dette. For det første, hvis du ved, hvilke computere du vil have resultaterne til, kan du simpelthen bruge parameteren ComputerName til Recieve -Job cmdlet.
Get-Job -Id 3 | Modtag-Job -Keep -ComputerName Viper
Alternativt kan du få resultaterne fra et bestemt børnejob ved hjælp af job id.
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 | Modtag-Job -Keep
WMI Jobs
WMI Jobs er stort set de samme som Fjernopgaver, der kræver kun parameteren -AsJob, der skal tilføjes til Get-WmiObject-cmdlet.
Desværre betyder det, at de også er underlagt de samme gotchas, som jeg nævnte i afsnittet Remote Jobs.
Planlagte job
De sidste tre slags job vi så på var ikke vedholdende, hvilket betyder at de kun er tilgængelige i din nuværende session. Dybest set betyder det, hvis du starter et job og derefter åbner en anden PowerShell Console og kører Get-Job, vil du ikke se nogen job. Men kom tilbage til konsollen, du sparkede jobbet fra, så vil du kunne se sin status. Dette er i modsætning til planlagte job som er vedholdende. Grundlæggende er en planlagt job en scriptblok, der kører på en tidsplan. Tidligere kunne den samme påvirkning være opnået ved hjælp af Windows Task Scheduler, hvilket virkelig er hvad der sker under hooden. For at oprette en ny planlagt job gør vi følgende:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily-5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
Der er en hel del foregår i den kommando, så lad os bryde den ned.
- For det første giver vi vores Scheduled Job et navn på GetEventLogs.
- Vi fortæller det, at når vi udløses, vil vi have det at køre indholdet af den angivne scriptblok, som grundlæggende får de nyeste 100 poster i sikkerhedshændelsesloggen.
- Dernæst angiver vi en trigger. Da triggerparameteren tager et triggerobjekt som input, brugte vi en parentetisk kommando til at generere en trigger, der vil gå ud hver dag klokken 5.
- Da vi beskæftiger os med hændelsesloggen, skal vi køre som administrator, som vi kan angive ved at oprette et nyt ScheduledJobOption-objekt og sende det til parameteren ScheduledJobOption.
Da dette er en lidt anden type job, skal du også bruge en anden kommando til at hente en liste over alle de planlagte job på en maskine.
Get-ScheduledJob
Det er alt der er til det.