about_Jobs

Krótki opis

Zawiera informacje o tym, jak zadania w tle programu PowerShell uruchamiają polecenie lub wyrażenie w tle bez interakcji z bieżącą sesją.

Długi opis

Program PowerShell uruchamia jednocześnie polecenia i skrypty za pośrednictwem zadań. Program PowerShell zapewnia trzy typy zadań do obsługi współbieżności.

  • RemoteJob - Polecenia i skrypty są uruchamiane w sesji zdalnej. Aby uzyskać więcej informacji, zobacz about_Remote_Jobs.
  • BackgroundJob - Polecenia i skrypty są uruchamiane w osobnym procesie na komputerze lokalnym.
  • PSTaskJob lub ThreadJob — polecenia i skrypty są uruchamiane w osobnym wątku w ramach tego samego procesu na komputerze lokalnym. Aby uzyskać więcej informacji, zobacz about_Thread_Jobs.

Zdalne uruchamianie skryptów na osobnym komputerze lub w osobnym procesie zapewnia doskonałą izolację. Wszelkie błędy występujące w zadaniu zdalnym nie mają wpływu na inne uruchomione zadania lub sesję nadrzędną, która uruchomiła zadanie. Jednak warstwa komunikacji zdalnej dodaje narzut, w tym serializacji obiektów. Wszystkie obiekty są serializowane i deserializowane, ponieważ są przekazywane między sesją nadrzędną i sesją zdalną (zadanie). Serializacja dużych złożonych obiektów danych może zużywać duże ilości zasobów obliczeniowych i pamięci oraz przesyłać duże ilości danych w sieci.

Zadania oparte na wątkach nie są tak niezawodne jak zadania zdalne i zadania w tle, ponieważ są uruchamiane w tym samym procesie w różnych wątkach. Jeśli jedno zadanie ma błąd krytyczny, który ulega awarii, wszystkie pozostałe zadania w procesie są przerywane.

Jednak zadania oparte na wątkach wymagają mniejszego obciążenia. Nie używają warstwy komunikacji zdalnej ani serializacji. Obiekty wynikowe są zwracane jako odwołania do obiektów na żywo w bieżącej sesji. Bez tego obciążenia zadania oparte na wątkach działają szybciej i używają mniejszej ilości zasobów niż inne typy zadań.

Ważne

Sesja nadrzędna, która utworzyła zadanie, monitoruje również stan zadania i zbiera dane potoku. Proces podrzędny zadania zostaje zakończony przez proces nadrzędny, gdy zadanie osiągnie stan zakończenia. Jeśli sesja nadrzędna zostanie przerwana, wszystkie uruchomione zadania podrzędne wraz z procesami podrzędnym zostaną zakończone.

Istnieją dwa sposoby na ominiecie tej sytuacji:

  1. Umożliwia Invoke-Command tworzenie zadań uruchamianych w sesjach rozłączonych. Aby uzyskać więcej informacji, zobacz about_Remote_Jobs.
  2. Użyj Start-Process funkcji , aby utworzyć nowy proces, a nie zadanie. Aby uzyskać więcej informacji, zobacz Uruchamianie procesu.

Polecenia cmdlet zadania

Polecenie cmdlet Opis
Start-Job Uruchamia zadanie w tle na komputerze lokalnym.
Get-Job Pobiera zadania w tle, które zostały uruchomione w
bieżąca sesja.
Receive-Job Pobiera wyniki zadań w tle.
Stop-Job Zatrzymuje zadanie w tle.
Wait-Job Pomija wiersz polecenia, dopóki jedno lub wszystkie zadania nie zostaną
Kompletny.
Remove-Job Usuwa zadanie w tle.
Invoke-Command Parametr AsJob tworzy zadanie w tle dla
komputer zdalny. Można użyć do Invoke-Command uruchomienia
dowolne polecenie zadania zdalnie, w tym Start-Jobpolecenie .

Jak uruchomić zadanie na komputerze lokalnym

Aby uruchomić zadanie w tle na komputerze lokalnym, użyj polecenia Start-Job cmdlet .

Aby napisać polecenie Start-Job , należy ująć polecenie uruchamiane w nawiasach klamrowych ({}). Użyj ScriptBlock parametru, aby określić polecenie.

Następujące polecenie uruchamia zadanie w tle, które uruchamia Get-Process polecenie na komputerze lokalnym.

Start-Job -ScriptBlock {Get-Process}

Po uruchomieniu zadania w tle wiersz polecenia zwraca natychmiast, nawet jeśli zadanie zajmuje dłuższy czas. Możesz kontynuować pracę w sesji bez przerwy podczas działania zadania.

Polecenie Start-Job zwraca obiekt reprezentujący zadanie. Obiekt zadania zawiera przydatne informacje o zadaniu, ale nie zawiera wyników zadania.

Możesz zapisać obiekt zadania w zmiennej, a następnie użyć go z innymi poleceniami cmdlet zadania do zarządzania zadaniem w tle. Następujące polecenie uruchamia obiekt zadania i zapisuje wynikowy obiekt zadania w zmiennej $job .

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

Począwszy od programu PowerShell 6.0, można uruchamiać zadanie w tle za pomocą operatora w tle (&) na końcu potoku. Aby uzyskać więcej informacji, zobacz operator tła.

Użycie operatora w tle jest funkcjonalnie równoważne użyciu Start-Job polecenia cmdlet z poprzedniego przykładu.

$job = Get-Process &

Pobieranie obiektów zadań

Polecenie Get-Job cmdlet zwraca obiekty reprezentujące zadania w tle uruchomione w bieżącej sesji. Bez parametrów zwraca Get-Job wszystkie zadania, które zostały uruchomione w bieżącej sesji.

Get-Job

Obiekt zadania zawiera stan zadania, który wskazuje, czy zadanie zostało zakończone. Ukończone zadanie ma stan Ukończono lub Niepowodzenie. Zadanie może być również zablokowane lub uruchomione.

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

Możesz zapisać obiekt zadania w zmiennej i użyć go do reprezentowania zadania w późniejszym poleceniu. Następujące polecenie pobiera zadanie o identyfikatorze 1 i zapisuje je w zmiennej $job .

$job = Get-Job -Id 1

Pobieranie wyników zadania

Po uruchomieniu zadania w tle wyniki nie są wyświetlane natychmiast. Aby uzyskać wyniki zadania w tle, użyj polecenia Receive-Job cmdlet .

W poniższym przykładzie Receive-Job polecenie cmdlet pobiera wyniki zadania przy użyciu obiektu zadania w zmiennej $job .

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. Następujące polecenie zapisuje wyniki zadania w zmiennej $job do zmiennej $results .

$results = Receive-Job -Job $job

Pobieranie i zachowywanie wyników częściowych zadań

Polecenie Receive-Job cmdlet pobiera wyniki zadania w tle. Jeśli zadanie zostanie ukończone, Receive-Job program pobiera wszystkie wyniki zadania. Jeśli zadanie jest nadal uruchomione, Receive-Job program pobiera wyniki, które zostały wygenerowane do tej pory. Możesz ponownie uruchomić Receive-Job polecenia, aby uzyskać pozostałe wyniki.

Domyślnie program Receive-Job usuwa wyniki z pamięci podręcznej, w której są przechowywane wyniki zadania. Po uruchomieniu Receive-Job ponownie otrzymasz tylko nowe wyniki, które dotarły po pierwszym uruchomieniu.

Następujące polecenia pokazują wyniki poleceń uruchamianych Receive-Job przed ukończeniem zadania.

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 zachowaj parametru, aby Receive-Job uniemożliwić usunięcie zwracanych wyników zadania. Następujące polecenia pokazują efekt użycia parametru Zachowaj w zadaniu, które nie zostało jeszcze ukończone.

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 wyniki

Jeśli uruchamiasz polecenie, które zajmuje dużo czasu, możesz użyć właściwości obiektu zadania, aby określić, kiedy zadanie zostanie ukończone. Następujące polecenie używa obiektu Get-Job , aby pobrać wszystkie zadania w tle w bieżącej sesji.

Get-Job

Wyniki zostaną wyświetlone w tabeli. Stan zadania jest wyświetlany w kolumnie Stan .

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 tym przypadku właściwość State pokazuje, że zadanie 2 jest nadal uruchomione. Jeśli chcesz teraz pobrać wyniki Receive-Job zadania za pomocą polecenia cmdlet , wyniki będą niekompletne. Aby uzyskać wszystkie wyniki Receive-Job , można wielokrotnie użyć polecenia cmdlet . Użyj właściwości State , aby określić, kiedy zadanie zostanie ukończone.

Możesz również użyć parametru Wait polecenia 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 będą dostępne.

Możesz również użyć polecenia Wait-Job cmdlet , aby poczekać na dowolne lub wszystkie wyniki zadania. Wait-Job Umożliwia oczekiwanie na co najmniej jedno określone zadanie lub dla wszystkich zadań. Następujące polecenie używa polecenia Wait-Job cmdlet , aby czekać na zadanie o identyfikatorze 10.

Wait-Job -ID 10

W związku z tym monit programu PowerShell jest pomijany do momentu ukończenia zadania.

Możesz również poczekać na wstępnie określony okres. To polecenie używa limitu czasu parametru, aby ograniczyć czas oczekiwania do 120 sekund. Po upływie tego czasu zostanie wyświetlony wiersz polecenia, ale zadanie będzie nadal działać w tle.

Wait-Job -ID 10 -Timeout 120

Zatrzymywanie zadania

Aby zatrzymać zadanie w tle, użyj Stop-Job polecenia cmdlet . Następujące polecenie uruchamia zadanie, aby uzyskać każdy wpis w dzienniku zdarzeń systemu. Zapisuje obiekt zadania w zmiennej $job .

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

Następujące polecenie zatrzymuje zadanie. Używa operatora potoku (|), aby wysłać zadanie w zmiennej do $job .Stop-Job

$job | Stop-Job

Usuwanie zadania

Aby usunąć zadanie w tle, użyj Remove-Job polecenia cmdlet . Następujące polecenie usuwa zadanie w zmiennej $job .

Remove-Job -Job $job

Badanie zadania, które zakończyło się niepowodzeniem

Zadania mogą się nie powieść z wielu powodów. Obiekt zadania zawiera właściwość Reason , która zawiera informacje o przyczyny błędu.

Poniższy przykład uruchamia zadanie bez wymaganych poświadczeń.

$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ść Reason , aby znaleźć błąd, który spowodował niepowodzenie zadania.

$job.ChildJobs[0].JobStateInfo.Reason

W takim przypadku zadanie nie powiodło się, ponieważ komputer zdalny wymagał jawnych poświadczeń do uruchomienia polecenia. Właściwość Reason zawiera następujący komunikat:

Nawiązywanie połączenia z serwerem zdalnym nie powiodło się z następującym komunikatem o błędzie: "Odmowa dostępu".

Zobacz też