Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Korte beschrijving
Hierin wordt beschreven hoe u achtergrondtaken uitvoert op externe computers.
Lange beschrijving
PowerShell voert gelijktijdig opdrachten en scripts uit via taken. PowerShell biedt drie typen taken ter ondersteuning van gelijktijdigheid.
- 
              
RemoteJob- Opdrachten en scripts worden uitgevoerd in een externe sessie. - 
              
BackgroundJob- Opdrachten en scripts worden uitgevoerd in een afzonderlijk proces op de lokale computer. Zie About Jobs (Taken) voor meer informatie. - 
              
PSTaskJobofThreadJob- 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 goede isolatie. Fouten die optreden in de externe taak, hebben geen invloed op andere actieve taken of de bovenliggende sessie die de taak heeft 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 die de taak heeft gemaakt, bewaakt 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 hun onderliggende processen beëindigd.
Er zijn twee manieren om deze situatie te omzeilen:
- Gebruik 
Invoke-Commanddit om taken te maken die worden uitgevoerd in niet-verbonden sessies. Zie de sectie met losgekoppelde processen van dit artikel. - Gebruik 
Start-Processdit 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 retourneert naar de lokale computer. Gebruik deze methode als u de resultaten van taken wilt verzamelen en wilt onderhouden op een centrale locatie op de lokale computer.
Voer een taak uit op een externe computer die de resultaten op de externe computer onderhoudt. Gebruik deze methode wanneer de taakgegevens veiliger worden onderhouden 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 voor meer informatie over interactieve sessies en zie Enter-PSSession.
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 vinden echter plaats op de externe computer, niet op de lokale computer.
Gebruik de
Enter-PSSessioncmdlet om een interactieve sessie met een externe computer te starten. U kunt de parameterEnter-PSSessionComputerName 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 Server01De opdrachtprompt verandert om aan te geven dat u nu bent verbonden met de Server01-computer.
Server01\C:>Gebruik de
Start-Jobcmdlet om een externe taak in de sessie te starten. Met de volgende opdracht wordt een externe taak uitgevoerd die de gebeurtenissen ophaalt in het Windows PowerShell-gebeurtenislogboek op de Server01-computer. DeStart-Jobcmdlet retourneert een object dat de taak vertegenwoordigt.Met deze opdracht wordt het taakobject opgeslagen in de
$jobvariabele.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, inclusief 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 achterhalen of de taak is voltooid, geeft u de waarde van de
$jobvariabele weer of gebruikt u deGet-Jobcmdlet om de taak op te halen. De volgende opdracht gebruikt deGet-Jobcmdlet 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...In
Get-Jobde uitvoer ziet u dat de taak wordt uitgevoerd op de localhost-computer omdat de taak is gestart en wordt uitgevoerd op dezelfde computer (in dit geval Server01).Gebruik de
Receive-Jobcmdlet om de resultaten van de taak op te 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 opgehaald in de variabele $job. 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.txtGebruik de
Exit-PSSessioncmdlet om de interactieve sessie te beëindigen. De opdrachtprompt wordt gewijzigd om aan te geven dat u terug bent in de oorspronkelijke sessie op de lokale computer.Server01\C:> Exit-PSSession C:\PS>Als u de inhoud van het
PsLog.txtbestand 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 wordt het beste uitgevoerd in een PSSession (een permanente verbinding) voor het geval u meerdere opdrachten wilt gebruiken om de gegevens in hetPsLog.txtbestand te onderzoeken en te beheren. Zie about_PSSessions voor meer informatie over PSSessions.De volgende opdrachten gebruiken de
New-PSSessioncmdlet om een PSSession te maken die is verbonden met de Server01-computer en ze gebruiken deInvoke-Commandcmdlet om eenGet-Contentopdracht 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 retourneert naar de lokale computer (AsJob)
Als u een taak wilt starten op een externe computer die de opdrachtresultaten naar de lokale computer retourneert, gebruikt u de AsJob-parameter van een cmdlet, zoals de Invoke-Command cmdlet.
Wanneer u de parameter AsJob gebruikt, wordt het taakobject daadwerkelijk gemaakt op de lokale computer, ook al wordt de taak uitgevoerd op de externe computer. Wanneer de taak is voltooid, worden de resultaten geretourneerd naar de lokale computer.
U kunt de cmdlets die het zelfstandig naamwoord (de taak-cmdlets) bevatten, gebruiken om elke taak te beheren die door een cmdlet is gemaakt. Veel van de cmdlets met AsJob-parameters gebruiken geen externe communicatie van 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.
De volgende opdracht gebruikt de AsJob-parameter van het starten van
Invoke-Commandeen taak op de Server01-computer. De taak voert eenGet-Eventlogopdracht uit waarmee de gebeurtenissen in het systeemlogboek worden opgeslagen. U kunt de parameter JobName gebruiken om een weergavenaam toe te wijzen aan de taak.Invoke-Command -ComputerName Server01 -ScriptBlock { Get-EventLog System} -AsJobDe resultaten van de opdracht lijken op de volgende voorbeelduitvoer.
SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 Get-EventLog SystemWanneer de parameter AsJob wordt gebruikt,
Invoke-Commandretourneert u hetzelfde type taakobject datStart-Jobwordt geretourneerd. U kunt het taakobject opslaan in een variabele of u kunt eenGet-Jobopdracht gebruiken om de taak op te halen.Houd er rekening mee dat de waarde van de eigenschap Locatie laat zien dat de taak is uitgevoerd op de Server01-computer.
Als u een taak wilt beheren die is gestart met behulp van de parameter AsJob van de
Invoke-Commandcmdlet, 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-Jobopdracht om te bepalen of de taak is voltooid. Met de volgende opdracht worden alle taken weergegeven die zijn gestart in de huidige sessie.Get-JobOmdat de externe taak is gestart in de huidige sessie, wordt de taak opgehaald met een lokale
Get-Jobopdracht. 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 SystemGebruik de
Receive-Jobcmdlet om de resultaten van de taak op te halen. Omdat de taakresultaten automatisch worden geretourneerd naar de computer waarop het taakobject zich bevindt, kunt u de resultaten ophalen met een lokaleReceive-Jobopdracht.De volgende opdracht gebruikt de
Receive-Jobcmdlet 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. U kunt de resultaten ook omleiden naar een bestand.$results = Receive-Job -Id 1
Een externe taak starten waarmee de resultaten op de externe computer worden opgeslagen
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 uit te voeren op meerdere computers.
Wanneer u een Start-Job opdracht op afstand uitvoert, wordt het taakobject gemaakt op de externe computer en worden de taakresultaten op de externe computer onderhouden.
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-Commandcmdlet om eenStart-Jobopdracht uit te voeren op een externe computer.Voor deze opdracht is een PSSession (een permanente verbinding) vereist. Als u de parameter
Invoke-CommandComputerName gebruikt om een tijdelijke verbinding tot stand te brengen, wordt deInvoke-Commandopdracht beschouwd als voltooid wanneer het taakobject wordt geretourneerd. Als gevolg hiervan wordt de tijdelijke verbinding gesloten en wordt de taak geannuleerd.De volgende opdracht gebruikt de
New-PSSessioncmdlet om een PSSession te maken die is verbonden met de Server01-computer. Met de opdracht wordt de PSSession opgeslagen in de$svariabele.$s = New-PSSession -ComputerName Server01De volgende opdracht gebruikt de
Invoke-Commandcmdlet om eenStart-Jobopdracht uit te voeren in de PSSession. DeStart-Jobopdracht en deGet-Eventlogopdracht 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 SystemWanneer u een
Start-Jobopdracht op afstand uitvoert,Invoke-Commandretourneert u hetzelfde type taakobject datStart-Jobwordt geretourneerd. U kunt het taakobject opslaan in een variabele of u kunt eenGet-Jobopdracht gebruiken om de taak op te halen.Houd er rekening mee dat de waarde van de eigenschap Locatie laat zien 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 op dezelfde computer wordt uitgevoerd, 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-Commandopdracht om eenGet-Jobopdracht 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 SystemAls u de resultaten van de taak wilt ophalen, gebruikt u de
Invoke-Commandcmdlet om eenReceive-Jobopdracht uit te voeren in de PSSession die is verbonden met de Server01-computer.De volgende opdracht gebruikt de
Receive-Jobcmdlet 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$resultsvariabele. Hierbij wordt de parameterReceive-JobKeep 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. De volgende opdracht maakt gebruik van een omleidingsoperator 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 alle actieve onderliggende taken samen met hun onderliggende processen beëindigd wanneer de bovenliggende sessie wordt beëindigd. U kunt externe communicatie op de lokale computer gebruiken om taken uit te voeren die niet zijn gekoppeld aan de huidige PowerShell-sessie.
Maak een nieuwe PowerShell-sessie op de lokale computer. Het gebruik 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. 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 ze opnieuw zijn verbonden.
# 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 waar Invoke-Command deze is uitgevoerd.