Geekskolan Lär dig hur du använder jobb i PowerShell
PowerShell har fyra typer av jobb - bakgrundsjobb, fjärrjobb, WMI-jobb och schemalagda jobb. Gå med i oss när vi får reda på vad de är och hur vi kan använda dem.
Var noga med att läsa de föregående artiklarna i serien:
- Lär dig hur du automatiserar Windows med PowerShell
- Att lära sig använda Cmdlets i PowerShell
- Lär dig hur man använder objekt i PowerShell
- Learning Formatering, filtrering och jämförelse i PowerShell
- Lär dig använda Remoting i PowerShell
- Använda PowerShell för att få datorinformation
- Arbeta med samlingar i PowerShell
Och håll dig uppdaterad för resten av serien hela veckan.
Bakgrundsjobb
Hittills har allt jag har visat dig inom PowerShell synkron, vilket betyder att vi skriver in något i skalet och kan inte göra så mycket förrän det här kommandot har slutförts. Det här är där bakgrundsjobben kommer in. För att starta en bakgrund, skickar jobbet enkelt ett skriptblock till cmdletet Start-jobb.
Start-Job-Name GetFileList -Scriptblock Get-ChildItem C: \ -Recurse
Nu är vi fria att göra vad vi vill ha inom skalet medan det här scriptblocket exekveras i bakgrunden.
När du startar ett nytt jobb skapar PowerShell ett nytt jobbobjekt som representerar det jobbet. Du kan när som helst få en lista över alla jobb genom att köra cmdlet Get-Job.
Arbetsobjekten berättar om statusen för jobben. Till exempel, i ovanstående skärmdump kan vi se att vi har en BackgroundJob som heter GetFileList som fortfarande körs, men har redan börjat returnera data. Om du vid något tillfälle bestämmer att jobbet har körts för länge, kan du enkelt stoppa det genom att leda det till Stop-Job.
Get-Job-Name GetFileList | Stop-Job
Men när du har slutat ett jobb, är det fortfarande möjligt att ta bort alla data som den mottog fram till den punkt som du stoppade. Det finns dock en gotcha. I PowerShell, när du får resultatet för ett jobb, blir de raderade. För att de ska kunna stanna måste du ange parameteren för fortsättningsbrytare för Mottagningsjobb.
Get-Job-Name GetFileList | Ta emot-jobb -Håll
När du är klar med ett jobb är det bästa sättet att ta bort det. För att ta bort jobbet, rör det helt enkelt till cmdlet Remove-Job.
Get-Job-Name GetFileList | Ta-Job
Detta tar bort den från listan över jobb som returneras av Get-Job.
Fjärrjobb
Några lektioner sedan, vi tittade på hur vi kan använda fjärrkontroll för att utföra PowerShell-kommandon på en fjärrmaskin med Invoke-Command, men visste du att du också kan använda Invoke-Command för att starta ett avlägsna jobb i bakgrunden? För att göra så lägger du bara till -AsJob-parametern till slutet av ditt kommando:
Invoke-Command -ComputerName Flash, Viper -Credential Administrator -ScriptBlock gci -AsJob
Det var ett enkelt kommando och borde ha slutfört genomförandet så nu kan vi titta på vår jobbstatus.
Hmm, ser ut som det misslyckades. Detta leder mig till min första gotcha med jobb. När du skapar ett nytt jobb av någon typ i PowerShell skapas det ett föräldrajobb utöver ett barnarbete för varje dator som du kör jobbet mot. När du använder cmdlet Get-Job, visas det bara de överordnade jobben och statens egendom är värsta scenariot, vilket betyder att även om kommandot bara misslyckades med att köra på en av hundra datorer, kommer det statliga arbetstillståndet att säga misslyckades. För att se en lista över barnjobb måste du använda IncludeChildJob-parametern.
Om du tittar närmare ser du att jobbet faktiskt bara misslyckades på en dator, vilket leder oss till nästa gotcha. När du försöker få resultatet för jobbet, om du anger föräldrars jobbnamn eller ID, kommer PowerShell att returnera data från alla barnjobb. Problemet är att om det fanns ett fel i ett av barnjobben kommer vi att vara kvar med någon röd text.
Det finns två sätt att komma runt detta. För det första, om du vet vilka datorer du vill ha resultaten för, kan du helt enkelt använda parametern ComputerName i Recieve -Job cmdlet.
Get-Job -Id 3 | Receive-Job -Keep -ComputerName Viper
Alternativt kan du få resultatet från ett specifikt barnjobb med sitt jobb-id.
Get-Job -Id 3 -IncludeChildJob
Get-Job -Id 5 | Ta emot-jobb -Håll
WMI-jobb
WMI-jobb är ungefär lika som fjärrjobb, vilket kräver att endast -AsJob-parametern läggs till i Get-WmiObject-cmdlet.
Tyvärr betyder det att de också är föremål för samma gotchas som jag nämnde i avsnittet Fjärrjobb.
Schemalagda jobb
De sista tre typerna av jobb vi tittade på var inte ihållande, vilket innebär att de bara är tillgängliga i din nuvarande session. I grund och botten betyder det om du startar ett jobb och sedan öppnar en annan PowerShell Console och kör Get-Job, så ser du inga jobb. Men kom tillbaka till konsolen du sparkade jobbet av från, du kommer att kunna se sin status. Detta står i kontrast till Schemalagda jobb som är beständiga. I grund och botten är ett schemalagt jobb ett manusblock som löper på ett schema. Tidigare kunde samma påverkan ha uppnåtts med hjälp av Windows Task Scheduler, vilket verkligen är vad som händer under huven. För att skapa ett nytt schemalagt jobb gör vi följande:
Register-ScheduledJob -Name GetEventLogs -ScriptBlock Get-EventLog -LogName Security -Newest 100 -Trigger (New-JobTrigger -Daily-5pm) -ScheduledJobOption (New-ScheduledJobOption -RunElevated)
Det är ganska mycket som händer i det kommandot, så låt oss bryta ner det.
- För det första ger vi vårt schemalagda jobb ett namn på GetEventLogs.
- Vi berättar då att när den utlöses vill vi att den ska köra innehållet i det angivna manuskriptet, vilket i grunden får de senaste 100 inmatningarna i säkerhetshändelseloggen.
- Därefter specificerar vi en trigger. Eftersom utlösarparametern tar ett utlösningsobjekt som input, använde vi ett parentesiskt kommando för att generera en trigger som kommer att gå av varje dag klockan 5:00.
- Eftersom vi behandlar händelseloggen måste vi köra som en administratör, som vi kan ange genom att skapa ett nytt ScheduledJobOption-objekt och överföra det till ScheduledJobOption-parametern.
Eftersom det här är en något annorlunda typ av jobb måste du också använda ett annat kommando för att hämta en lista över alla schemalagda jobb på en maskin.
Get-ScheduledJob
Det är allt som finns där.