about_Remote_Jobs
Korte beschrijving
Beschrijft hoe u achtergrondtaken uitvoert op externe computers.
Gedetailleerde beschrijving
PowerShell voert gelijktijdig opdrachten en scripts uit via taken. PowerShell biedt drie taaktypen ter ondersteuning van gelijktijdigheid.
RemoteJob
- Opdrachten en scripts worden uitgevoerd in een externe sessie.BackgroundJob
- Opdrachten en scripts worden in een afzonderlijk proces op de lokale computer uitgevoerd. Zie About Jobs (Taken) voor meer informatie.PSTaskJob
ofThreadJob
- Opdrachten en scripts worden uitgevoerd in een afzonderlijke thread binnen hetzelfde proces op de lokale computer. Zie about_Thread_Jobs voor meer informatie.
Het extern uitvoeren van scripts, op een afzonderlijke computer of in een afzonderlijk proces, biedt een uitstekende isolatie. Eventuele fouten in de externe taak hebben geen invloed op andere actieve taken of de bovenliggende sessie waarmee de taak is gestart. De externe laag voegt echter overhead toe, inclusief objectserialisatie. Alle objecten worden geserialiseerd en gedeserialiseerd wanneer ze worden doorgegeven tussen de bovenliggende sessie en de externe (taak)sessie. Serialisatie van grote complexe gegevensobjecten kan grote hoeveelheden reken- en geheugenresources verbruiken en grote hoeveelheden gegevens overdragen via het netwerk.
Belangrijk
De bovenliggende sessie waarmee de taak is gemaakt, controleert ook de taakstatus en verzamelt pijplijngegevens. Het onderliggende taakproces wordt beëindigd door het bovenliggende proces zodra de taak een voltooide status heeft bereikt. Als de bovenliggende sessie wordt beëindigd, worden alle actieve onderliggende taken samen met de onderliggende processen beëindigd.
Er zijn twee manieren om deze situatie te omzeilen:
- Gebruik
Invoke-Command
om taken te maken die worden uitgevoerd in niet-verbonden sessies. Zie de sectie losgekoppelde processen van dit artikel. - Gebruik
Start-Process
om een nieuw proces te maken in plaats van een taak. Zie Start-Process voor meer informatie.
Externe taken
U kunt taken uitvoeren op externe computers met behulp van drie verschillende methoden.
Start een interactieve sessie op een externe computer. Start vervolgens een taak in de interactieve sessie. De procedures zijn hetzelfde als het uitvoeren van een lokale taak, hoewel alle acties worden uitgevoerd op de externe computer.
Voer een taak uit op een externe computer die de resultaten naar de lokale computer retourneert. Gebruik deze methode wanneer u de resultaten van taken wilt verzamelen en deze op een centrale locatie op de lokale computer wilt bewaren.
Voer een taak uit op een externe computer die de resultaten op de externe computer behoudt. Gebruik deze methode wanneer de taakgegevens veiliger worden bijgehouden op de oorspronkelijke computer.
Een taak starten in een interactieve sessie
U kunt een interactieve sessie starten met een externe computer en vervolgens een taak starten tijdens de interactieve sessie. Zie about_Remote en zie Enter-PSSession
voor meer informatie over interactieve sessies.
De procedure voor het starten van een taak in een interactieve sessie is bijna identiek aan de procedure voor het starten van een achtergrondtaak op de lokale computer. Alle bewerkingen worden echter uitgevoerd op de externe computer, niet op de lokale computer.
Gebruik de
Enter-PSSession
cmdlet om een interactieve sessie te starten met een externe computer. U kunt de parameter ComputerName vanEnter-PSSession
gebruiken om een tijdelijke verbinding tot stand te brengen voor de interactieve sessie. U kunt ook de sessieparameter gebruiken om de interactieve sessie uit te voeren in een PowerShell-sessie (PSSession).Met de volgende opdracht start u een interactieve sessie op de Server01-computer.
C:\PS> Enter-PSSession -computername Server01
De opdrachtprompt wordt gewijzigd om aan te geven dat u nu bent verbonden met de Server01-computer.
Server01\C:>
Gebruik
Start-Job
de cmdlet om een externe taak in de sessie te starten. Met de volgende opdracht wordt een externe taak uitgevoerd waarmee de gebeurtenissen in het gebeurtenislogboek Windows PowerShell op de Server01-computer worden opgeslagen. DeStart-Job
cmdlet retourneert een object dat de taak vertegenwoordigt.Met deze opdracht wordt het taakobject opgeslagen in de
$job
variabele.Server01\C:> $job = Start-Job -scriptblock { Get-Eventlog "Windows PowerShell" }
Terwijl de taak wordt uitgevoerd, kunt u de interactieve sessie gebruiken om andere opdrachten uit te voeren, waaronder andere taken. U moet de interactieve sessie echter geopend houden totdat de taak is voltooid. Als u de sessie beëindigt, wordt de taak onderbroken en gaan de resultaten verloren.
Als u wilt controleren of de taak is voltooid, geeft u de waarde van de
$job
variabele weer of gebruikt u deGet-Job
cmdlet om de taak op te halen. Met de volgende opdracht wordt deGet-Job
cmdlet gebruikt om de taak weer te geven.Server01\C:> Get-Job $job SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost Get-Eventlog "Windows...
De
Get-Job
uitvoer laat zien dat de taak wordt uitgevoerd op de computer 'localhost', omdat de taak is gestart op en wordt uitgevoerd op dezelfde computer (in dit geval Server01).Gebruik de cmdlet om de resultaten van de taak op te
Receive-Job
halen. U kunt de resultaten in de interactieve sessie weergeven of opslaan in een bestand op de externe computer. Met de volgende opdracht worden de resultaten van de taak in de variabele $job opgehaald. De opdracht gebruikt de omleidingsoperator (>
) om de resultaten van de taak op te slaan in het PsLog.txt-bestand op de Server01-computer.Server01\C:> Receive-Job $job > c:\logs\PsLog.txt
Gebruik
Exit-PSSession
de cmdlet om de interactieve sessie te beëindigen. De opdrachtprompt wordt gewijzigd om aan te geven dat u zich weer in de oorspronkelijke sessie op de lokale computer bevindt.Server01\C:> Exit-PSSession C:\PS>
Als u de inhoud van het
PsLog.txt
bestand op de Server01-computer op elk gewenst moment wilt weergeven, start u een andere interactieve sessie of voert u een externe opdracht uit. Dit type opdracht kunt u het beste uitvoeren in een PSSession (een permanente verbinding) voor het geval u verschillende opdrachten wilt gebruiken om de gegevens in hetPsLog.txt
bestand te onderzoeken en te beheren. Zie about_PSSessions voor meer informatie over PSSessions.De volgende opdrachten gebruiken de
New-PSSession
cmdlet om een PSSession te maken die is verbonden met de Server01-computer en ze gebruiken deInvoke-Command
cmdlet om eenGet-Content
opdracht uit te voeren in de PSSession om de inhoud van het bestand weer te geven.$s = New-PSSession -computername Server01 Invoke-Command -session $s -scriptblock { Get-Content c:\logs\pslog.txt}
Een externe taak starten die de resultaten naar de lokale computer retourneert (AsJob)
Als u een taak wilt starten op een externe computer die de opdrachtresultaten naar de lokale computer retourneert, gebruikt u de parameter AsJob van een cmdlet zoals de Invoke-Command
cmdlet.
Wanneer u de parameter AsJob gebruikt, wordt het taakobject daadwerkelijk op de lokale computer gemaakt, zelfs als de taak wordt uitgevoerd op de externe computer. Wanneer de taak is voltooid, worden de resultaten geretourneerd naar de lokale computer.
U kunt de cmdlets met het zelfstandig naamwoord Taak (de taak-cmdlets) gebruiken om elke taak te beheren die door een cmdlet is gemaakt. Veel van de cmdlets met AsJob-parameters maken geen gebruik van externe communicatie met PowerShell, dus u kunt ze zelfs gebruiken op computers die niet zijn geconfigureerd voor externe communicatie en die niet voldoen aan de vereisten voor externe communicatie.
Met de volgende opdracht wordt de parameter AsJob van
Invoke-Command
gebruikt om een taak op de Server01-computer te starten. De taak voert eenGet-Eventlog
opdracht uit die de gebeurtenissen in het systeemlogboek ophaalt. U kunt de parameter JobName gebruiken om een weergavenaam toe te wijzen aan de taak.Invoke-Command -computername Server01 -scriptblock { Get-Eventlog system} -AsJob
De resultaten van de opdracht lijken op de volgende voorbeelduitvoer.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 Get-Eventlog system
Wanneer de parameter AsJob wordt gebruikt,
Invoke-Command
wordt hetzelfde type taakobject geretourneerd datStart-Job
wordt geretourneerd. U kunt het taakobject opslaan in een variabele of u kunt eenGet-Job
opdracht gebruiken om de taak op te halen.Houd er rekening mee dat de waarde van de eigenschap Locatie aangeeft dat de taak is uitgevoerd op de Server01-computer.
Als u een taak wilt beheren die is gestart met de parameter AsJob van de
Invoke-Command
cmdlet, gebruikt u de taak-cmdlets. Omdat het taakobject dat de externe taak vertegenwoordigt zich op de lokale computer bevindt, hoeft u geen externe opdrachten uit te voeren om de taak te beheren.Gebruik een
Get-Job
opdracht om te bepalen of de taak is voltooid. Met de volgende opdracht haalt u alle taken op die in de huidige sessie zijn gestart.Get-Job
Omdat de externe taak in de huidige sessie is gestart, wordt de taak opgehaald met een lokale
Get-Job
opdracht. De eigenschap State van het taakobject geeft aan dat de opdracht is voltooid.SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 Get-Eventlog system
Gebruik de cmdlet om de resultaten van de taak op te
Receive-Job
halen. Omdat de taakresultaten automatisch worden geretourneerd naar de computer waarop het taakobject zich bevindt, kunt u de resultaten ophalen met een lokaleReceive-Job
opdracht.Met de volgende opdracht wordt de
Receive-Job
cmdlet gebruikt om de resultaten van de taak op te halen. De sessie-id wordt gebruikt om de taak te identificeren. Met deze opdracht worden de taakresultaten opgeslagen in de variabele $results. U kunt de resultaten ook omleiden naar een bestand.$results = Receive-Job -id 1
Een externe taak starten die de resultaten op de externe computer bewaart
Als u een taak wilt starten op een externe computer die de opdrachtresultaten op de externe computer bewaart, gebruikt u de Invoke-Command
cmdlet om een Start-Job
opdracht uit te voeren op een externe computer. U kunt deze methode gebruiken om taken op meerdere computers uit te voeren.
Wanneer u een Start-Job
opdracht op afstand uitvoert, wordt het taakobject gemaakt op de externe computer en worden de taakresultaten bewaard op de externe computer.
Vanuit het perspectief van de taak zijn alle bewerkingen lokaal. U voert alleen opdrachten op afstand uit om een lokale taak op de externe computer te beheren.
Gebruik de
Invoke-Command
cmdlet om eenStart-Job
opdracht uit te voeren op een externe computer.Voor deze opdracht is een PSSession (een permanente verbinding) vereist. Als u de parameter ComputerName van
Invoke-Command
gebruikt om een tijdelijke verbinding tot stand te brengen, wordt deInvoke-Command
opdracht beschouwd als voltooid wanneer het taakobject wordt geretourneerd. Als gevolg hiervan wordt de tijdelijke verbinding gesloten en wordt de taak geannuleerd.Met de volgende opdracht wordt de
New-PSSession
cmdlet gebruikt om een PSSession te maken die is verbonden met de Server01-computer. Met de opdracht wordt de PSSession opgeslagen in de$s
variabele.$s = New-PSSession -computername Server01
De volgende opdracht gebruikt de
Invoke-Command
cmdlet om eenStart-Job
opdracht uit te voeren in de PSSession. DeStart-Job
opdracht en deGet-Eventlog
opdracht staan tussen accolades.Invoke-Command -session $s -scriptblock { Start-Job -scriptblock {Get-Eventlog system}}
De resultaten lijken op de volgende voorbeelduitvoer.
Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 2 Job2 Running True Localhost Get-Eventlog system
Wanneer u een
Start-Job
opdracht extern uitvoert,Invoke-Command
wordt hetzelfde type taakobject geretourneerd datStart-Job
wordt geretourneerd. U kunt het taakobject opslaan in een variabele of u kunt eenGet-Job
opdracht gebruiken om de taak op te halen.Houd er rekening mee dat de waarde van de eigenschap Location aangeeft dat de taak is uitgevoerd op de lokale computer, ook wel LocalHost genoemd, ook al is de taak uitgevoerd op de Server01-computer. Omdat het taakobject wordt gemaakt op de Server01-computer en de taak wordt uitgevoerd op dezelfde computer, wordt het beschouwd als een lokale achtergrondtaak.
Gebruik de taak-cmdlets om een externe taak te beheren. Omdat het taakobject zich op de externe computer bevindt, moet u externe opdrachten uitvoeren om de taakresultaten op te halen, te stoppen, te wachten of op te halen.
Als u wilt zien of de taak is voltooid, gebruikt u een
Invoke-Command
opdracht om eenGet-Job
opdracht uit te voeren in de PSSession die is verbonden met de Server01-computer.Invoke-Command -session $s -scriptblock {Get-Job}
De opdracht retourneert een taakobject. De eigenschap State van het taakobject geeft aan dat de opdracht is voltooid.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 2 Job2 Completed True LocalHost Get-Eventlog system
Als u de resultaten van de taak wilt ophalen, gebruikt u de
Invoke-Command
cmdlet om eenReceive-Job
opdracht uit te voeren in de PSSession die is verbonden met de Server01-computer.Met de volgende opdracht wordt de
Receive-Job
cmdlet gebruikt om de resultaten van de taak op te halen. De sessie-id wordt gebruikt om de taak te identificeren. Met deze opdracht worden de taakresultaten opgeslagen in de$results
variabele. De parameter Keep vanReceive-Job
wordt gebruikt om het resultaat in de taakcache op de externe computer te houden.$results = Invoke-Command -session $s -scriptblock { Receive-Job -SessionId 2 -Keep }
U kunt de resultaten ook omleiden naar een bestand op de lokale of externe computer. Met de volgende opdracht wordt een omleidingsoperator gebruikt om de resultaten op te slaan in een bestand op de Server01-computer.
Invoke-Command -session $s -command { Receive-Job -SessionId 2 > c:\logs\pslog.txt }
Uitvoeren als een losgekoppeld proces
Zoals eerder vermeld, worden, wanneer de bovenliggende sessie wordt beëindigd, alle actieve onderliggende taken samen met de onderliggende processen beëindigd. U kunt externe toegang op de lokale computer gebruiken om taken uit te voeren die niet zijn gekoppeld aan de huidige PowerShell-sessie.
Creatie een nieuwe PowerShell-sessie op de lokale computer. De te gebruiken Invoke-Command
om een taak in deze sessie te starten. Invoke-Command
hiermee kunt u een externe sessie verbreken en de bovenliggende sessie beëindigen. Later kunt u een nieuwe PowerShell-sessie starten en verbinding maken met de eerder verbroken sessie om de bewaking van de taak te hervatten. Alle gegevens die zijn geretourneerd naar de oorspronkelijke PowerShell-sessie gaan echter verloren wanneer die sessie wordt beëindigd. Alleen nieuwe gegevensobjecten die worden gegenereerd nadat de verbinding is verbroken, worden geretourneerd wanneer er opnieuw verbinding wordt gemaakt.
# 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
...
In dit voorbeeld zijn de taken nog steeds gekoppeld aan een bovenliggende PowerShell-sessie.
De bovenliggende sessie is echter niet de oorspronkelijke PowerShell-sessie waarin Invoke-Command
is uitgevoerd.