Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Kort beskrivning
Beskriver hur du kör bakgrundsjobb på fjärrdatorer.
Lång beskrivning
PowerShell kör samtidigt kommandon och skript via jobb. Det finns tre jobbtyper som tillhandahålls av PowerShell för att stödja samtidighet.
-
RemoteJob– Kommandon och skript körs i en fjärrsession. -
BackgroundJob– Kommandon och skript körs i en separat process på den lokala datorn. Mer information finns i artikeln om jobb. -
PSTaskJobellerThreadJob– Kommandon och skript körs i en separat tråd i samma process på den lokala datorn. Mer information finns i about_Thread_Jobs.
Om du kör skript via fjärranslutning, på en separat dator eller i en separat process, får du bra isolering. Eventuella fel som uppstår i fjärrjobbet påverkar inte andra jobb som körs eller den överordnade sessionen som startade jobbet. Dock lägger fjärrkommunikationsskiktet till omkostnader, inklusive objektserialisering. Alla objekt serialiseras och deserialiseras när de skickas mellan den överordnade sessionen och fjärrsessionen (jobbet). Serialisering av stora komplexa dataobjekt kan förbruka stora mängder beräknings- och minnesresurser och överföra stora mängder data i nätverket.
Viktigt!
Den överordnade sessionen som skapade jobbet övervakar också jobbstatusen och samlar in pipelinedata. Den underordnade jobbprocessen avslutas av den överordnade processen när jobbet når ett slutfört tillstånd. Om den överordnade sessionen avslutas avslutas alla underordnade jobb som körs tillsammans med deras underordnade processer.
Det finns två sätt att kringgå den här situationen:
- Använd
Invoke-Commandför att skapa jobb som körs i frånkopplade sessioner. Se avsnittet frånkopplade processer i den här artikeln. - Använd
Start-Processför att skapa en ny process i stället för ett jobb. Mer information finns i Startprocess.
Fjärrjobb
Du kan köra jobb på fjärrdatorer med hjälp av tre olika metoder.
Starta en interaktiv session på en fjärrdator. Starta sedan ett jobb i den interaktiva sessionen. Procedurerna är desamma som när du kör ett lokalt jobb, även om alla åtgärder utförs på fjärrdatorn.
Kör ett jobb på en fjärrdator som returnerar resultatet till den lokala datorn. Använd den här metoden när du vill samla in resultatet av jobb och underhålla dem på en central plats på den lokala datorn.
Kör ett jobb på en fjärrdator som underhåller sina resultat på fjärrdatorn. Använd den här metoden när jobbdata underhålls säkrare på den ursprungliga datorn.
Starta ett jobb i en interaktiv session
Du kan starta en interaktiv session med en fjärrdator och sedan starta ett jobb under den interaktiva sessionen. Mer information om interaktiva sessioner finns i about_Remote och se Enter-PSSession.
Proceduren för att starta ett jobb i en interaktiv session är nästan identisk med proceduren för att starta ett bakgrundsjobb på den lokala datorn. Alla åtgärder sker dock på fjärrdatorn, inte på den lokala datorn.
Använd cmdleten
Enter-PSSessionför att starta en interaktiv session med en fjärrdator. Du kan använda parameternEnter-PSSessionComputerName för för att upprätta en tillfällig anslutning för den interaktiva sessionen. Du kan också använda sessionsparametern för att köra den interaktiva sessionen i en PowerShell-session (PSSession).Följande kommando startar en interaktiv session på Server01-datorn.
C:\PS> Enter-PSSession -ComputerName Server01Kommandotolken ändras för att visa att du nu är ansluten till Server01-datorn.
Server01\C:>Om du vill starta ett fjärrjobb i sessionen använder du cmdleten
Start-Job. Följande kommando kör ett fjärrjobb som hämtar händelserna i Windows PowerShell-händelseloggen på Server01-datorn. CmdletenStart-Jobreturnerar ett objekt som representerar jobbet.Det här kommandot sparar jobbobjektet i variabeln
$job.Server01\C:> $job = Start-Job -ScriptBlock { Get-EventLog "Windows PowerShell" }När jobbet körs kan du använda den interaktiva sessionen för att köra andra kommandon, inklusive andra jobb. Du måste dock hålla den interaktiva sessionen öppen tills jobbet har slutförts. Om du avslutar sessionen avbryts jobbet och resultatet går förlorat.
Om du vill ta reda på om jobbet är klart visar du värdet för variabeln
$jobeller använder cmdletenGet-Jobför att hämta jobbet. Följande kommando använder cmdletenGet-Jobför att visa jobbet.Server01\C:> Get-Job $job SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost Get-EventLog "Windows...Utdata
Get-Jobvisar att jobbet körs på datorn "localhost" eftersom jobbet startades och körs på samma dator (i det här fallet Server01).Om du vill få resultatet av jobbet använder du cmdleten
Receive-Job. Du kan visa resultatet i den interaktiva sessionen eller spara dem i en fil på fjärrdatorn. Följande kommando hämtar resultatet av jobbet i variabeln $job. Kommandot använder omdirigeringsoperatorn (>) för att spara resultatet av jobbet i filen PsLog.txt på Server01-datorn.Server01\C:> Receive-Job $job > C:\logs\PsLog.txtOm du vill avsluta den interaktiva sessionen använder du cmdleten
Exit-PSSession. Kommandotolken ändras för att visa att du är tillbaka i den ursprungliga sessionen på den lokala datorn.Server01\C:> Exit-PSSession C:\PS>Om du vill visa innehållet i
PsLog.txtfilen på Server01-datorn när som helst startar du en annan interaktiv session eller kör ett fjärrkommando. Den här typen av kommando körs bäst i en PSSession (en beständig anslutning) om du vill använda flera kommandon för att undersöka och hantera data iPsLog.txtfilen. Mer information om PSSessioner finns i about_PSSessions.Följande kommandon använder cmdleten
New-PSSessionför att skapa en PSSession som är ansluten till Server01-datorn, och de använder cmdletenInvoke-Commandför att köra ettGet-Contentkommando i PSSession för att visa innehållet i filen.$s = New-PSSession -ComputerName Server01 Invoke-Command -Session $s -ScriptBlock { Get-Content C:\logs\pslog.txt}
Starta ett fjärrjobb som returnerar resultatet till den lokala datorn (AsJob)
Om du vill starta ett jobb på en fjärrdator som returnerar kommandoresultatet till den lokala datorn använder du asjob-parametern för en cmdlet, till exempel cmdletenInvoke-Command.
När du använder asjob-parametern skapas jobbobjektet faktiskt på den lokala datorn trots att jobbet körs på fjärrdatorn. När jobbet har slutförts returneras resultatet till den lokala datorn.
Du kan använda de cmdletar som innehåller jobbets substantiv (jobb-cmdletarna) för att hantera alla jobb som skapats av valfri cmdlet. Många av de cmdletar som har AsJob-parametrar använder inte PowerShell-fjärrkommunikation, så du kan använda dem även på datorer som inte har konfigurerats för fjärrkommunikation och som inte uppfyller kraven för fjärrkommunikation.
Följande kommando använder asjob-parametern
Invoke-Commandför för att starta ett jobb på Server01-datorn. Jobbet kör ettGet-Eventlogkommando som hämtar händelserna i systemloggen. Du kan använda parametern JobName för att tilldela ett visningsnamn till jobbet.Invoke-Command -ComputerName Server01 -ScriptBlock { Get-EventLog System} -AsJobResultatet av kommandot liknar följande exempelutdata.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 Get-EventLog SystemNär parametern AsJob används
Invoke-Commandreturnerar samma typ av jobbobjekt somStart-Jobreturneras. Du kan spara jobbobjektet i en variabel eller använda ettGet-Jobkommando för att hämta jobbet.Observera att värdet för egenskapen Plats visar att jobbet kördes på Server01-datorn.
Om du vill hantera ett jobb som startats med hjälp av parametern AsJob för cmdleten
Invoke-Commandanvänder du cmdletarna Jobb. Eftersom jobbobjektet som representerar fjärrjobbet finns på den lokala datorn behöver du inte köra fjärrkommandon för att hantera jobbet.Om du vill ta reda på om jobbet är klart använder du ett
Get-Jobkommando. Följande kommando hämtar alla jobb som startades i den aktuella sessionen.Get-JobEftersom fjärrjobbet startades i den aktuella sessionen hämtar ett lokalt
Get-Jobkommando jobbet. Jobbobjektets tillståndsegenskap visar att kommandot har slutförts.SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 Get-EventLog SystemOm du vill få resultatet av jobbet använder du cmdleten
Receive-Job. Eftersom jobbresultatet automatiskt returneras till den dator där jobbobjektet finns kan du få resultatet med ett lokaltReceive-Jobkommando.Följande kommando använder cmdleten
Receive-Jobför att hämta resultatet av jobbet. Den använder sessions-ID:t för att identifiera jobbet. Det här kommandot sparar jobbresultatet i variabeln $results. Du kan också omdirigera resultatet till en fil.$results = Receive-Job -Id 1
Starta ett fjärrjobb som behåller resultatet på fjärrdatorn
Om du vill starta ett jobb på en fjärrdator som behåller kommandoresultatet på fjärrdatorn använder du cmdleten Invoke-Command för att köra ett Start-Job kommando på en fjärrdator. Du kan använda den här metoden för att köra jobb på flera datorer.
När du kör ett Start-Job kommando via fjärranslutning skapas jobbobjektet på fjärrdatorn och jobbresultaten underhålls på fjärrdatorn.
Ur jobbets perspektiv är alla åtgärder lokala. Du kör bara kommandon via fjärranslutning för att hantera ett lokalt jobb på fjärrdatorn.
Använd cmdleten
Invoke-Commandför att köra ettStart-Jobkommando på en fjärrdator.Det här kommandot kräver en PSSession (en beständig anslutning). Om du använder parametern
Invoke-CommandComputerName för för att upprätta en tillfällig anslutningInvoke-Commandanses kommandot vara slutfört när jobbobjektet returneras. Det innebär att den tillfälliga anslutningen stängs och jobbet avbryts.Följande kommando använder cmdleten
New-PSSessionför att skapa en PSSession som är ansluten till Server01-datorn. Kommandot sparar PSSession i variabeln$s.$s = New-PSSession -ComputerName Server01Nästa kommando använder cmdleten
Invoke-Commandför att köra ettStart-Jobkommando i PSSession. KommandotStart-JobochGet-Eventlogkommandot omges av klammerparenteser.Invoke-Command -Session $s -ScriptBlock { Start-Job -ScriptBlock {Get-EventLog System}}Resultatet liknar följande exempelutdata.
Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 2 Job2 Running True Localhost Get-EventLog SystemNär du kör ett
Start-Jobkommando via fjärranslutningInvoke-Commandreturnerar samma typ av jobbobjekt somStart-Jobreturneras. Du kan spara jobbobjektet i en variabel eller använda ettGet-Jobkommando för att hämta jobbet.Observera att värdet för egenskapen Plats visar att jobbet kördes på den lokala datorn, som kallas "LocalHost", även om jobbet kördes på Server01-datorn. Eftersom jobbobjektet skapas på Server01-datorn och jobbet körs på samma dator anses det vara ett lokalt bakgrundsjobb.
Om du vill hantera ett fjärrjobb använder du cmdletarna Jobb . Eftersom jobbobjektet finns på fjärrdatorn måste du köra fjärrkommandon för att hämta, stoppa, vänta på eller hämta jobbresultatet.
Om du vill se om jobbet är klart använder du ett
Invoke-Commandkommando för att köra ettGet-Jobkommando i PSSession som är anslutet till Server01-datorn.Invoke-Command -Session $s -ScriptBlock {Get-Job}Kommandot returnerar ett jobbobjekt. Jobbobjektets tillståndsegenskap visar att kommandot har slutförts.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 2 Job2 Completed True LocalHost Get-EventLog SystemFör att få resultatet av jobbet använder du cmdleten
Invoke-Commandför att köra ettReceive-Jobkommando i PSSession som är anslutet till Server01-datorn.Följande kommando använder cmdleten
Receive-Jobför att hämta resultatet av jobbet. Den använder sessions-ID:t för att identifiera jobbet. Det här kommandot sparar jobbresultatet i variabeln$results. Den använder parameternReceive-JobBehåll för för att behålla resultatet i jobbcachen på fjärrdatorn.$results = Invoke-Command -Session $s -ScriptBlock { Receive-Job -SessionId 2 -Keep }Du kan också omdirigera resultatet till en fil på den lokala datorn eller fjärrdatorn. Följande kommando använder en omdirigeringsoperator för att spara resultatet i en fil på Server01-datorn.
Invoke-Command -Session $s -Command { Receive-Job -SessionId 2 > C:\logs\pslog.txt }
Så här kör du som en frånkopplad process
Som tidigare nämnts avslutas alla underordnade jobb som körs tillsammans med deras underordnade processer när den överordnade sessionen avslutas. Du kan använda fjärrkommunikation på den lokala datorn för att köra jobb som inte är kopplade till den aktuella PowerShell-sessionen.
Skapa en ny PowerShell-session på den lokala datorn. Användning Invoke-Command för att starta ett jobb i den här sessionen.
Invoke-Command gör att du kan koppla från en fjärrsession och avsluta den överordnade sessionen. Senare kan du starta en ny PowerShell-session och ansluta till den tidigare frånkopplade sessionen för att återuppta övervakningen av jobbet. Data som returnerades till den ursprungliga PowerShell-sessionen går dock förlorade när sessionen avslutas. Endast nya dataobjekt som genereras efter frånkopplingen returneras när de återansluts.
# Create remote session on local machine
PS> $session = New-PSSession -Cn localhost
# Start remote job
PS> $job = Invoke-Command -Session $session -ScriptBlock { 1..60 | % { sleep 1; "Output $_" } } -AsJob
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Running True localhost 1..60 | % { sleep 1; ...
# Disconnect the job session
PS> Disconnect-PSSession $session
Id Name Transport ComputerName ComputerType State ConfigurationName Availability
-- ---- --------- ------------ ------------ ----- ----------------- ------------
1 Runspace1 WSMan localhost RemoteMachine Disconnected Microsoft.PowerShell None
PS> $job
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Job1 RemoteJob Disconnected True localhost 1..60 | % { sleep 1;
# Reconnect the session to a new job object
PS> $jobNew = Receive-PSSession -Session $session -OutTarget Job
PS> $job | Wait-Job | Receive-Job
Output 9
Output 10
Output 11
...
I det här exemplet är jobben fortfarande kopplade till en överordnad PowerShell-session.
Den överordnade sessionen är dock inte den ursprungliga PowerShell-sessionen som Invoke-Command kördes.