Delen via


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 of ThreadJob - 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:

  1. Gebruik Invoke-Command dit om taken te maken die worden uitgevoerd in niet-verbonden sessies. Zie de sectie met losgekoppelde processen van dit artikel.
  2. 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.

  1. Gebruik de Enter-PSSession cmdlet om een interactieve sessie met een externe computer te starten. U kunt de parameter Enter-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:>
    
  2. 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. De Start-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.

  3. Als u wilt achterhalen of de taak is voltooid, geeft u de waarde van de $job variabele weer of gebruikt u de Get-Job cmdlet om de taak op te halen. De volgende opdracht gebruikt de Get-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).

  4. 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
    
  5. 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>
    
  6. 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 het PsLog.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 de Invoke-Command cmdlet om een Get-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.

  1. De volgende opdracht gebruikt de AsJob-parameter van het starten van Invoke-Command een taak op de Server01-computer. De taak voert een Get-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 dat Start-Job wordt geretourneerd. U kunt het taakobject opslaan in een variabele of u kunt een Get-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.

  2. 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
    
  3. 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 lokale Receive-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.

  1. Gebruik de Invoke-Command cmdlet om een Start-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 de Invoke-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 een Start-Job opdracht uit te voeren in de PSSession. De Start-Job opdracht en de Get-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 dat Start-Job wordt geretourneerd. U kunt het taakobject opslaan in een variabele of u kunt een Get-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.

  2. 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 een Get-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
    
  3. Als u de resultaten van de taak wilt ophalen, gebruikt u de Invoke-Command cmdlet om een Receive-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 parameter Receive-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.

Zie ook