Skip to main content

Geek School: Lær hvordan du bruker jobb i PowerShell

Geek School: Lær hvordan du bruker jobb i PowerShell

Geoffrey Carr

PowerShell har fire typer jobber - bakgrunnsjobber, eksterne jobber, WMI-jobber og planlagte jobber. Bli med oss ​​da vi finner ut hva de er og hvordan vi kan bruke dem.

Husk å lese de forrige artiklene i serien:

  • Lær hvordan du automatiserer Windows med PowerShell
  • Lære å bruke Cmdlets i PowerShell
  • Lære hvordan du bruker objekter i PowerShell
  • Læreformatering, filtrering og sammenligning i PowerShell
  • Lær å bruke Remoting i PowerShell
  • Bruke PowerShell til å få datamaskininformasjon
  • Arbeider med samlinger i PowerShell

Og hold deg innstilt for resten av serien hele uken.

Bakgrunnsjobber

Hittil har alt jeg har vist deg i PowerShell vært synkront, noe som betyr at vi skriver noe inn i skallet og ikke kan gjøre mye før den kommandoen er ferdig. Det er her bakgrunnsjobber kommer inn. For å starte en bakgrunn, sender jobben bare en skriptblokk til Start-jobb-cmdlet.

Start-Job –Name GetFileList –Scriptblock {Get-ChildItem C: –Recurse}

Nå er vi fri til å gjøre hva vi vil inne i skallet mens den skriptblokken kjøres i bakgrunnen.

Når du starter en ny jobb, oppretter PowerShell et nytt jobbobjekt som representerer den jobben. Du kan når som helst få en liste over alle jobber ved å kjøre Get-Job-cmdlet.

Jobobjektene forteller deg om jobbenes status. For eksempel kan vi i ovenstående skjermbilde se at vi har en BackgroundJob kalt GetFileList som fortsatt kjører, men har allerede begynt å returnere data. Hvis du på et hvilket som helst tidspunkt bestemmer at jobben har kjørt for lenge, kan du enkelt stoppe den ved å røre den til Stop-Job.

Get-Job –Name GetFileList | Stop-Job

Men når du har stoppet en jobb, er det fortsatt data som er mottatt til det punktet du stoppet det. Det er en gotcha, skjønt. I PowerShell, når du mottar resultatene for en jobb, blir de slettet. For at de skal forbli, må du angi parameteren fortsettbryter for mottak-jobb.

Get-Job –Name GetFileList | Receive-Job –Keep

Når du er ferdig med en jobb, er det best å fjerne det. For å fjerne jobben, rør den bare til Fjern-jobb-cmdlet.

Get-Job –Name GetFileList | Remove-Job

Dette vil fjerne den fra listen over jobber som returneres av Get-Job.

Fjernjobber

Noen få leksjoner siden, vi så på hvordan vi kan bruke fjernkontroll for å utføre PowerShell-kommandoer på en ekstern maskin ved hjelp av Invoke-kommando, men visste du at du også kan bruke Invoke-kommando for å slå av en fjernbetjening i bakgrunnen? For å gjøre det, legg ganske enkelt til -AsJob-parameteren på slutten av kommandoen din:

Invoke-Command -ComputerName Flash,Viper -Credential administrator -ScriptBlock {gci} –AsJob

Det var en enkel kommando og burde ha fullført utførelsen nå, så vi kan se på jobbstatusen vår.

Hmm, ser ut som det mislyktes. Dette bringer meg til min første gotcha med jobber. Når du oppretter en ny jobb av en hvilken som helst type i PowerShell, oppretter den en foreldrejobb i tillegg til en barnjobb for hver datamaskin som du kjører jobben mot. Når du bruker cmdlet Get-Job, vises bare de overordnede jobber, og statens eiendom er worst case scenario, noe som betyr at selv om kommandoen bare ikke kan kjøre på en av hundre datamaskiner, vil den overordnede jobben staten si mislyktes. For å se en liste over barnjobber må du bruke IncludeChildJob-parameteren.

Hvis du ser nærmere, vil du se at jobben egentlig bare sviktte på en datamaskin, noe som bringer oss til neste gotcha. Når du prøver å få resultatene for jobben, vil du sende dataene fra alle barnjobbene hvis du angir foreldrenes jobbnavn eller ID. Problemet er at hvis det var en feil i en av barnejobben, skal vi bli igjen med litt rød tekst.

Det er to måter å komme seg rundt på. For det første, hvis du vet hvilke datamaskiner du vil ha resultatene for, kan du ganske enkelt bruke parameteren ComputerName til mottak -Job-cmdlet.

Get-Job –Id 3 | Receive-Job –Keep –ComputerName Viper

Alternativt kan du få resultatene fra et bestemt barnjobb ved hjelp av jobb-ID.

Get-Job -Id 3 –IncludeChildJob

Get-Job -Id 5 | Receive-Job –Keep

WMI Jobs

WMI-jobber er mye de samme som eksterne jobber, og krever bare parameteren -AsJob som skal legges til Get-WmiObject cmdlet.

Dessverre betyr dette at de også er underlagt de samme gotkasene jeg nevnte i Remote Jobs-delen.

Planlagte jobber

De tre siste jobben vi så på, var ikke vedvarende, noe som betyr at de bare er tilgjengelige i din nåværende økt. I utgangspunktet betyr det at hvis du starter en jobb og deretter åpner en annen PowerShell Console og kjører Get-Job, ser du ingen jobber. Men kom tilbake til konsollen du sparket jobben av fra, du vil kunne se sin status. Dette er i kontrast til planlagte jobber som er vedvarende. I utgangspunktet er en planlagt jobb en skriptblokk som går på en tidsplan. Tidligere kunne den samme effekten ha blitt oppnådd ved hjelp av Windows Task Scheduler, som egentlig er hva som skjer under hetten. For å opprette en ny planlagt jobb gjør vi følgende:

Register-ScheduledJob -Name GetEventLogs -ScriptBlock {Get-EventLog -LogName Security -Newest 100} -Trigger (New-JobTrigger -Daily -At 5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)

Det skjer ganske mye i den kommandoen, så la oss slå den ned.

  • Først gir vi vår planlagte jobb et navn på GetEventLogs.
  • Vi forteller da at når den utløses, vil vi at den skal kjøre innholdet i den angitte skriptblokken, som i utgangspunktet får de nyeste 100 oppføringene i sikkerhetshendelsesloggen.
  • Deretter spesifiserer vi en utløser. Siden triggerparameteren tar et utløserobjekt som input, brukte vi en parentetisk kommando for å generere en trigger som vil gå av hver dag klokka 5:00.
  • Siden vi arbeider med hendelsesloggen, må vi kjøre som administrator, som vi kan spesifisere ved å opprette et nytt ScheduledJobOption-objekt og sende det til parameteren ScheduledJobOption.

Siden dette er en litt annen type jobb, må du også bruke en annen kommando for å hente en liste over alle planlagte jobber på en maskin.

Get-ScheduledJob

Det er alt der er til det.

Link
Plus
Send
Send
Pin