29Aug
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.
Husk at læse de tidligere artikler i serien:
- Lær hvordan du automatiserer Windows med PowerShell
- Lær at bruge Cmdlets i PowerShell
- Lær at bruge objekter i PowerShell
- Lær formatering, filtrering og sammenligning i PowerShell
- Lær at bruge fjernelse iPowerShell
- Brug af PowerShell til at få computeroplysninger
- Arbejde med samlinger i PowerShell
Og hold dig indstillet til resten af serien hele ugen.
Baggrundsjob
Indtil nu har alt, hvad jeg har vist dig inden for PowerShell, været synkront, hvilket betyder at vi skriver noget i skallen og ikke rigtig gør meget, før kommandoen er færdig. Det er her, hvor baggrundsjobbet 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.
Arbejdsobjektene fortæller dig om status for jobene. For eksempel kan vi i ovenstående skærmbillede se, at vi har en BackgroundJob kaldet GetFileList, der stadig kører, men har allerede startet 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 pipere det til Stop-Job.
Get-Job-Name GetFileList |Stop-Job
Men når du har stoppet et job, er de data, det modtog, indtil det punkt, du stoppede det, stadig tilgængeligt. 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 Keep-switch for Receive-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øre det til cmdlet Fjern-job.
Get-Job-Name GetFileList |Fjern-Job
Dette fjerner det fra listen over job, der returneres af Get-Job.
Remote Jobs
Et par lektioner siden har vi set 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 også, at du 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 være færdig med at køre nuLad os se på vores jobstatus.
Hmm, ser ud til at den 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, 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 selv om kommandoen kun kan køre på en ud af hundrede computere, vil den overordnede jobstat sigemislykkedes. 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 data fra alle børnejobene, hvis du angiver forældrenes jobnavn eller ID.Problemet er, at hvis der var 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å.For det første, hvis du ved, hvilke computere du vil have resultaterne til, kan du bare bruge parameteren ComputerName i 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 meget de samme som Fjernopgaver, der kræver, at parameteren -AsJob kun tilføjes til Get-WmiObject cmdlet.
Desværre betyder dette, 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, at 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, og du vil kunne se sin status. Dette er i modsætning til planlagte job, som er vedvarende .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 -Am 5pm) -ScheduledJobOption( New-ScheduledJobOption-RunElevated)
Der er en hel del foregår i den kommando, så lad os bryde den ned.
- Først giver vi vores Scheduled Job et navn på GetEventLogs.
- Vi fortæller det, at når det 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 kl. 5:00.
- 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.