Informacje o zadaniachAbout Jobs

Krótki opisShort description

Zawiera informacje o tym, w jaki sposób zadania w tle programu PowerShell uruchamiają polecenie lub wyrażenie w tle bez współpracy z bieżącą sesją.Provides information about how PowerShell background jobs run a command or expression in the background without interacting with the current session.

Długi opisLong description

Program PowerShell jednocześnie uruchamia polecenia i skrypty za poorednictwem zadań.PowerShell concurrently runs commands and scripts through jobs. Program PowerShell udostępnia trzy typy zadań do obsługi współbieżności.There are three jobs types provided by PowerShell to support concurrency.

  • RemoteJob — Polecenia i skrypty są uruchamiane w sesji zdalnej.RemoteJob - Commands and scripts run on a remote session. Aby uzyskać więcej informacji, zobacz about_Remote_Jobs.For information, see about_Remote_Jobs.
  • BackgroundJob — Polecenia i skrypty są uruchamiane w osobnym procesie na komputerze lokalnym.BackgroundJob - Commands and scripts run in a separate process on the local machine.
  • PSTaskJob lub ThreadJob polecenia i skrypty są uruchamiane w osobnym wątku w ramach tego samego procesu na komputerze lokalnym.PSTaskJob or ThreadJob - Commands and scripts run in a separate thread within the same process on the local machine. Aby uzyskać więcej informacji, zobacz about_Thread_Jobs.For more information, see about_Thread_Jobs.

Uruchamianie skryptów zdalnie, na osobnym komputerze lub w osobnym procesie, zapewnia doskonałą izolację.Running scripts remotely, on a separate machine or in a separate process, provides great isolation. Wszelkie błędy występujące w zadaniu zdalnym nie wpływają na inne uruchomione zadania lub sesję nadrzędną, która uruchomiła to zadanie.Any errors that occur in the remote job do not affect other running jobs or the parent session that started the job. Jednak warstwa zdalna dodaje obciążenie, w tym serializacja obiektu.However, the remoting layer adds overhead, including object serialization. Wszystkie obiekty są serializowane i deserializowane, gdy są przesyłane między sesją nadrzędną a sesją zdalną (zadanie).All objects are serialized and deserialized as they are passed between the parent session and the remote (job) session. Serializacja dużych złożonych obiektów danych może zużywać duże ilości zasobów obliczeniowych i pamięci oraz transferować duże ilości danych w sieci.Serialization of large complex data objects can consume large amounts of compute and memory resources and transfer large amounts of data across the network.

Zadania oparte na wątkach nie są tak niezawodne jak zadania zdalne i w tle, ponieważ są uruchamiane w tym samym procesie w różnych wątkach.Thread-based jobs are not as robust as remote and background jobs, because they run in the same process on different threads. Jeśli jedno zadanie ma krytyczny błąd powodujący awarię procesu, wszystkie pozostałe zadania w procesie zostaną zakończone.If one job has a critical error that crashes the process, then all other jobs in the process are terminated.

Zadania oparte na wątkach wymagają jednak mniejszego obciążenia.However, thread-based jobs require less overhead. Nie korzystają one z warstwy lub serializacji komunikacji zdalnej.They don't use the remoting layer or serialization. Obiekty wynikowe są zwracane jako odwołania do obiektów aktywnych w bieżącej sesji.The result objects are returned as references to live objects in the current session. Bez tego obciążenia zadania oparte na wątkach działają szybciej i używają mniej zasobów niż inne typy zadań.Without this overhead, thread-based jobs run faster and use fewer resources than the other job types.

Ważne

Sesja nadrzędna, która utworzyła zadanie, również monitoruje stan zadania i zbiera dane potoku.The parent session that created the job also monitors the job status and collects pipeline data. Proces podrzędny zadania jest zakończony przez proces nadrzędny, gdy zadanie osiągnie stan zakończenia.The job child process is terminated by the parent process once the job reaches a finished state. Jeśli sesja nadrzędna zostanie zakończona, wszystkie uruchomione zadania podrzędne zostaną zakończone wraz z ich procesami podrzędnymi.If the parent session is terminated, all running child jobs are terminated along with their child processes.

Istnieją dwa sposoby obejścia tej sytuacji:There are two ways work around this situation:

  1. Służy Invoke-Command do tworzenia zadań uruchamianych w odłączonych sesjach.Use Invoke-Command to create jobs that run in disconnected sessions. Aby uzyskać więcej informacji, zobacz about_Remote_Jobs.For more information, see about_Remote_Jobs.
  2. Służy Start-Process do tworzenia nowego procesu, a nie zadania.Use Start-Process to create a new process rather than a job. Aby uzyskać więcej informacji, zobacz Uruchamianie-proces.For more information, see Start-Process.

Polecenia cmdlet zadaniaThe job cmdlets

Polecenie cmdletCmdlet OpisDescription
Start-Job Uruchamia zadanie w tle na komputerze lokalnym.Starts a background job on a local computer.
Get-Job Pobiera zadania w tle, które zostały uruchomione wGets the background jobs that were started in the
bieżąca sesja.current session.
Receive-Job Pobiera wyniki zadań w tle.Gets the results of background jobs.
Stop-Job Kończy zadanie w tle.Stops a background job.
Wait-Job Pomija wiersz polecenia do momentu, gdy jedno lub wszystkie zadania sąSuppresses the command prompt until one or all jobs are
wykonanie.complete.
Remove-Job Usuwa zadanie w tle.Deletes a background job.
Invoke-Command Parametr AsJob tworzy zadanie w tle naThe AsJob parameter creates a background job on a
komputer zdalny.remote computer. Można użyć Invoke-Command do uruchomieniaYou can use Invoke-Command to run
Każde polecenie zadania zdalne, w tym Start-Job .any job command remotely, including Start-Job.

Jak uruchomić zadanie na komputerze lokalnymHow to start a job on the local computer

Aby uruchomić zadanie w tle na komputerze lokalnym, użyj Start-Job polecenia cmdlet.To start a background job on the local computer, use the Start-Job cmdlet.

Aby napisać Start-Job polecenie, umieść polecenie, że zadanie jest uruchamiane w nawiasach klamrowych ( {} ).To write a Start-Job command, enclose the command that the job runs in curly braces ({}). Użyj parametru ScriptBlock , aby określić polecenie.Use the ScriptBlock parameter to specify the command.

Następujące polecenie uruchamia zadanie w tle, które uruchamia Get-Process polecenie na komputerze lokalnym.The following command starts a background job that runs a Get-Process command on the local computer.

Start-Job -ScriptBlock {Get-Process}

Po uruchomieniu zadania w tle wiersz polecenia wraca natychmiast, nawet jeśli ukończenie zadania trwa dłuższy czas.When you start a background job, the command prompt returns immediately, even if the job takes an extended time to complete. Po uruchomieniu zadania można kontynuować pracę w sesji bez przerw.You can continue to work in the session without interruption while the job runs.

Start-JobPolecenie zwraca obiekt, który reprezentuje zadanie.The Start-Job command returns an object that represents the job. Obiekt zadania zawiera przydatne informacje o zadaniu, ale nie zawiera wyników zadania.The job object contains useful information about the job, but it does not contain the job results.

Obiekt zadania można zapisać w zmiennej, a następnie użyć go z innymi poleceniami cmdlet zadania , aby zarządzać zadaniem w tle.You can save the job object in a variable and then use it with the other Job cmdlets to manage the background job. Następujące polecenie uruchamia obiekt zadania i zapisuje obiekt wyników w $job zmiennej.The following command starts a job object and saves the resulting job object in the $job variable.

$job = Start-Job -ScriptBlock {Get-Process}

Począwszy od programu PowerShell 6,0, można użyć operatora tła ( & ) na końcu potoku, aby uruchomić zadanie w tle.Beginning in PowerShell 6.0, you can use the background operator (&) at the end of a pipeline to start a background job. Aby uzyskać więcej informacji, zobacz operator w tle.For more information, see background operator.

Użycie operatora Background jest funkcjonalnie równoważne z użyciem Start-Job polecenia cmdlet w poprzednim przykładzie.Using the background operator is functionally equivalent to using the Start-Job cmdlet in the previous example.

$job = Get-Process &

Pobieranie obiektów zadańGetting job objects

Get-JobPolecenie cmdlet zwraca obiekty, które reprezentują zadania w tle, które zostały uruchomione w bieżącej sesji.The Get-Job cmdlet returns objects that represent the background jobs that were started in the current session. Bez parametrów Get-Job zwraca wszystkie zadania, które zostały uruchomione w bieżącej sesji.Without parameters, Get-Job returns all of the jobs that were started in the current session.

Get-Job

Obiekt zadania zawiera stan zadania, który wskazuje, czy zadanie zostało zakończone.The job object contains the state of the job, which indicates whether the job has finished. Zakończone zadanie ma stan ukończono lub nie powiodło się.A finished job has a state of Complete or Failed. Zadanie może być również zablokowane lub uruchomione.A job might also be Blocked or Running.

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

Obiekt zadania można zapisać w zmiennej i użyć go do reprezentowania zadania w późniejszym poleceniu.You can save the job object in a variable and use it to represent the job in a later command. Następujące polecenie pobiera zadanie o IDENTYFIKATORze 1 i zapisuje je w $job zmiennej.The following command gets the job with ID 1 and saves it in the $job variable.

$job = Get-Job -Id 1

Pobieranie wyników zadaniaGetting the results of a job

Gdy uruchomisz zadanie w tle, wyniki nie będą wyświetlane od razu.When you run a background job, the results do not appear immediately. Aby uzyskać wyniki zadania w tle, użyj Receive-Job polecenia cmdlet.To get the results of a background job, use the Receive-Job cmdlet.

W poniższym przykładzie Receive-Job polecenie cmdlet pobiera wyniki zadania przy użyciu obiektu zadania w $job zmiennej.The following example, the Receive-Job cmdlet gets the results of the job using job object in the $job variable.

Receive-Job -Job $job
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)    Id ProcessName
-------  ------    -----      ----- -----   ------    -- -----------
    103       4    11328       9692    56           1176 audiodg
    804      14    12228      14108   100   101.74  1740 CcmExec
    668       7     2672       6168   104    32.26   488 csrss
...

Wyniki zadania można zapisać w zmiennej.You can save the results of a job in a variable. Następujące polecenie zapisuje wyniki zadania w $job zmiennej do $results zmiennej.The following command saves the results of the job in the $job variable to the $results variable.

$results = Receive-Job -Job $job

Pobieranie i przechowywanie częściowych wyników zadaniaGetting and keeping partial job results

Receive-JobPolecenie cmdlet pobiera wyniki zadania w tle.The Receive-Job cmdlet gets the results of a background job. Jeśli zadanie zostało zakończone, Receive-Job Pobiera wszystkie wyniki zadań.If the job is complete, Receive-Job gets all job results. Jeśli zadanie jest nadal uruchomione, Receive-Job Pobiera wyniki, które zostały wcześniej wygenerowane.If the job is still running, Receive-Job gets the results that have been generated thus far. Możesz ponownie uruchomić Receive-Job polecenia, aby uzyskać pozostałe wyniki.You can run Receive-Job commands again to get the remaining results.

Domyślnie program Receive-Job usuwa wyniki z pamięci podręcznej, w której są przechowywane wyniki zadania.By default, Receive-Job deletes the results from the cache where job results are stored. Po Receive-Job ponownym uruchomieniu programu otrzymasz tylko nowe wyniki, które dotarły po pierwszym uruchomieniu.When you run Receive-Job again, you get only the new results that arrived after the first run.

Następujące polecenia pokazują wyniki Receive-Job uruchamiania poleceń przed ukończeniem zadania.The following commands show the results of Receive-Job commands run before the job is complete.

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    68       3     2632        664    29     0.36   1388 ccmsetup
   749      22    21468      19940   203   122.13   3644 communicator
   905       7     2980       2628    34   197.97    424 csrss
  1121      25    28408      32940   174   430.14   3048 explorer

Użyj parametru Keep , aby zapobiec Receive-Job usunięciu wyników zadania, które są zwracane.Use the Keep parameter to prevent Receive-Job from deleting the job results that are returned. Poniższe polecenia pokazują efekt użycia parametru Keep w zadaniu, które nie zostało jeszcze ukończone.The following commands show the effect of using the Keep parameter on a job that is not yet complete.

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec
     68       3     2632        664    29     0.36   1388 ccmsetup
    749      22    21468      19940   203   122.13   3644 communicator
    905       7     2980       2628    34   197.97    424 csrss
   1121      25    28408      32940   174   430.14   3048 explorer

Oczekiwanie na wynikiWaiting for the results

Jeśli uruchamiasz polecenie, którego wykonanie trwa długo, możesz użyć właściwości obiektu zadania, aby określić, kiedy zadanie zostało zakończone.If you run a command that takes a long time to complete, you can use the properties of the job object to determine when the job is complete. Następujące polecenie używa Get-Job obiektu do pobrania wszystkich zadań w tle w bieżącej sesji.The following command uses the Get-Job object to get all of the background jobs in the current session.

Get-Job

Wyniki są wyświetlane w tabeli.The results appear in a table. Stan zadania zostanie wyświetlony w kolumnie stan .The status of the job appears in the State column.

Id Name  PSJobTypeName State    HasMoreData Location  Command
-- ----  ------------- -----    ----------- --------  -------
1  Job1  BackgroundJob Complete True        localhost Get-Process
2  Job2  BackgroundJob Running  True        localhost Get-EventLog -Log ...
3  Job3  BackgroundJob Complete True        localhost dir -Path C:\* -Re...

W takim przypadku Właściwość State pokazuje, że zadanie 2 jest nadal uruchomione.In this case, the State property reveals that Job 2 is still running. Jeśli używasz Receive-Job polecenia cmdlet, aby uzyskać teraz wyniki zadania, wyniki byłyby niekompletne.If you were to use the Receive-Job cmdlet to get the job results now, the results would be incomplete. Możesz użyć Receive-Job polecenia cmdlet wielokrotnie, aby uzyskać wszystkie wyniki.You can use the Receive-Job cmdlet repeatedly to get all of the results. Użyj właściwości State , aby określić, kiedy zadanie zostało zakończone.Use the State property to determine when the job is complete.

Można również użyć parametru wait Receive-Job polecenia cmdlet.You can also use the Wait parameter of the Receive-Job cmdlet. W przypadku użycia tego parametru polecenie cmdlet nie zwraca wiersza polecenia, dopóki zadanie nie zostanie ukończone i wszystkie wyniki są dostępne.When use use this parameter, the cmdlet does not return the command prompt until the job is completed and all results are available.

Możesz również użyć Wait-Job polecenia cmdlet, aby oczekiwać na wszystkie lub wszystkie wyniki zadania.You can also use the Wait-Job cmdlet to wait for any or all of the results of the job. Wait-Job umożliwia zaczekanie na jedno lub więcej określonych zadań lub dla wszystkich zadań.Wait-Job lets you wait for one or more specific job or for all jobs. Następujące polecenie używa polecenia Wait-Job cmdlet do oczekiwania na zadanie o identyfikatorzeThe following command uses the Wait-Job cmdlet to wait for a job with ID 10.

Wait-Job -ID 10

W efekcie monit programu PowerShell zostanie pominięty, dopóki zadanie nie zostanie ukończone.As a result, the PowerShell prompt is suppressed until the job is completed.

Możesz również poczekać przez określony czas.You can also wait for a predetermined period of time. To polecenie używa parametru limitu czasu , aby ograniczyć oczekiwanie do 120 sekund.This command uses the Timeout parameter to limit the wait to 120 seconds. Po upływie tego czasu wiersz polecenia zwraca wartość, ale zadanie kontynuuje działanie w tle.When the time expires, the command prompt returns, but the job continues to run in the background.

Wait-Job -ID 10 -Timeout 120

Zatrzymywanie zadaniaStopping a job

Aby zatrzymać zadanie w tle, użyj Stop-Job polecenia cmdlet.To stop a background job, use the Stop-Job cmdlet. Następujące polecenie uruchamia zadanie, aby pobrać wszystkie wpisy w dzienniku zdarzeń systemu.The following command starts a job to get every entry in the System event log. Zapisuje obiekt zadania w $job zmiennej.It saves the job object in the $job variable.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

Następujące polecenie zatrzyma zadanie.The following command stops the job. Używa operatora potoku ( | ) do wysłania zadania ze $job zmiennej do Stop-Job .It uses a pipeline operator (|) to send the job in the $job variable to Stop-Job.

$job | Stop-Job

Usuwanie zadaniaDeleting a job

Aby usunąć zadanie w tle, użyj Remove-Job polecenia cmdlet.To delete a background job, use the Remove-Job cmdlet. Następujące polecenie usuwa zadanie ze $job zmiennej.The following command deletes the job in the $job variable.

Remove-Job -Job $job

Badanie zadania zakończonego niepowodzeniemInvestigating a failed job

Zadania mogą się nie powieść z wielu powodów.Jobs can fail for many reasons. Obiekt zadania zawiera właściwość przyczyny , która zawiera informacje o przyczynie niepowodzenia.the job object contains a Reason property that contains information about the cause of the failure.

Poniższy przykład uruchamia zadanie bez wymaganych poświadczeń.The following example starts a job without the required credentials.

$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job

Id Name  PSJobTypeName State  HasMoreData  Location  Command
-- ----  ------------- -----  -----------  --------  -------
1  Job1  BackgroundJob Failed False        localhost New-Item -Path HKLM:...

Sprawdź Właściwość Przyczyna , aby znaleźć błąd, który spowodował niepowodzenie zadania.Inspect the Reason property to find the error that caused the job to fail.

$job.ChildJobs[0].JobStateInfo.Reason

W takim przypadku zadanie nie powiodło się, ponieważ komputer zdalny wymaga jawnych poświadczeń do uruchomienia polecenia.In this case, the job failed because the remote computer required explicit credentials to run the command. Właściwość Przyczyna zawiera następujący komunikat:The Reason property contains the following message:

Nawiązywanie połączenia z serwerem zdalnym nie powiodło się i wystąpił następujący komunikat o błędzie: "odmowa dostępu".Connecting to remote server failed with the following error message: "Access is denied".

Zobacz takżeSee also