29Aug

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

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ær å bruke Cmdlets i PowerShell
  • Lær hvordan du bruker objekter i PowerShell
  • Læringsformatering, filtrering og sammenligning i PowerShell
  • Lær å bruke Remoting iPowerShell
  • Bruke PowerShell til å få datamaskininformasjon
  • Arbeide med samlinger i PowerShell

Og hold deg innstilt for resten av serien hele uken.

Bakgrunnsjobber

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

Start-jobb-Navn GetFileList -Scriptblock{ Get-ChildItem C: \ -Recurse}

Nå er vi fri til å gjøre hva vi vil ha i skallet mens den scriptblokken 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.

Arbeidsobjektene forteller deg om statusen til jobbene. 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 |Stopp-jobb

Men når du har stoppet en jobb, er dataene det mottok, til det punktet du stoppet, fortsatt tilgjengelig. 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 |Motta-jobb -Hjelp

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 |Fjern-jobb

Dette fjerner det fra listen over jobber som returneres av Get-Job.

Remote Jobs

Noen få leksjoner siden, vi så på hvordan vi kan bruke remoting til å utføre PowerShell-kommandoer på en ekstern maskin ved hjelp av Invoke-Command, men visste at du også kan bruke Invoke-Command til å avbryte en fjerntliggende jobb i bakgrunnen? For å gjøre dette, 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 blitt ferdig med å kjøre nåLa oss 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 simislyktes. For å se en liste over barnjobber må du bruke IncludeChildJob-parameteren.

Hvis du ser nærmere, vil du se at jobben egentlig bare sviktet 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 |Motta-jobb -Keep -ComputerName Viper

Alternativt kan du få resultatene fra en bestemt barnejobb ved hjelp av jobb-ID.

Get-Job -Id 3 -IncludeChildJob

Get-Job -Id 5 |Motta-jobb-Hent

WMI-jobber

WMI-jobber er omtrent det 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 kun 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-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 jobber 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.