about_Remote_Jobs
Korte beschrijving
Hierin wordt beschreven hoe u achtergrondtaken uitvoert op externe computers.
Gedetailleerde 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.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 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-Command
dit om taken te maken die worden uitgevoerd in niet-verbonden sessies. Zie de sectie met losgekoppelde processen van dit artikel. - Gebruik
Start-Process
dit 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-PSSession
cmdlet om een interactieve sessie met een externe computer te starten. U kunt de parameterEnter-PSSession
ComputerName 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 verandert om aan te geven dat u nu bent verbonden met de Server01-computer.
Server01\C:>
Gebruik de
Start-Job
cmdlet 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-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, 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
$job
variabele weer of gebruikt u deGet-Job
cmdlet om de taak op te halen. De volgende opdracht gebruikt deGet-Job
cmdlet 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-Job
de 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-Job
cmdlet 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.txt
Gebruik de
Exit-PSSession
cmdlet 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.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 wordt het beste uitgevoerd in een PSSession (een permanente verbinding) voor het geval u meerdere 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 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-Command
een taak op de Server01-computer. De taak voert eenGet-Eventlog
opdracht 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} -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
retourneert u hetzelfde type taakobject 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 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-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 worden alle taken weergegeven die zijn gestart in de huidige sessie.Get-Job
Omdat de externe taak is gestart in de huidige sessie, 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
Receive-Job
cmdlet 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-Job
opdracht.De volgende opdracht gebruikt de
Receive-Job
cmdlet 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-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
Invoke-Command
ComputerName 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.De volgende opdracht gebruikt de
New-PSSession
cmdlet 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 op afstand uitvoert,Invoke-Command
retourneert u hetzelfde type taakobject 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 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-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.De volgende opdracht gebruikt de
Receive-Job
cmdlet 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. Hierbij wordt de parameterReceive-Job
Keep 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.