Hjemmeside » hvordan » Geek School Lær hvordan du bruker jobb i PowerShell

    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æ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å informasjon om datamaskinen
    • 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. Dette er hvor 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 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 Stopp-jobb.

    Get-Job-Name GetFileList | Stopp-Job

    Men når du har stoppet en jobb, er det fortsatt tilgjengelige data som den mottok frem til det punktet du stoppet. 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 -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 | Fjern-Job

    Dette vil fjerne det 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-Command til å avbryte en fjern 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 fullført utførelsen nå, så vi kan se på jobbstatusen vår.

    Hmm, ser ut som det mislyktes. Dette bringer meg på min første gotcha med jobber. Når du oppretter en ny jobb av noe slag i PowerShell, oppretter den en foreldrejobb i tillegg til en barnjobb for hver datamaskin du kjører jobben mot. Når du bruker cmdlet Get-Job, viser det 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 sviktet på en datamaskin, noe som bringer oss til neste gotcha. Når du prøver å få resultatene for jobben, vil du ved å angi foreldrenes jobbnavn eller ID, sende PowerShell dataene fra alle barnjobbene. Problemet er at hvis det oppstod en feil i en av barnejobben, kommer vi til å 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 av Recieve -Job cmdlet.

    Get-Job -Id 3 | Motta-jobb -Keep -ComputerName Viper

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

    Get-Job -Id 3 -IncludeChildJob

    Get-Job -Id 5 | Motta-jobb -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 typene jobber 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 slår av en jobb og deretter åpner en annen PowerShell Console og kjører Get-Job, vil du ikke se noen 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 går 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 håndterer 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.