Udostępnij przez


O ofertach pracy

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

W tym temacie wyjaśniono, jak uruchamiać zadania w tle w programie PowerShell na komputerze lokalnym. Aby uzyskać informacje na temat uruchamiania zadań w tle na komputerach zdalnych, zobacz about_Remote_Jobs.

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

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ą
ukończyć.
Remove-Job Usuwa zadanie w tle.
Invoke-Command Parametr AsJob uruchamia dowolne polecenie jako tło
zadania na komputerze zdalnym. Można również użyć
Invoke-Command aby zdalnie uruchomić dowolne polecenie zadania,
w tym polecenie Start-Job.

JAK URUCHOMIĆ ZADANIE NA KOMPUTERZE LOKALNYM

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

Aby napisać polecenie Start-Job, umieść polecenie, które jest uruchamiane przez zadanie, w nawiasach klamrowych ( { } ). Użyj parametru ScriptBlock, aby określić polecenie.

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

Start-Job -ScriptBlock {Get-Process}

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

Zapisz obiekt zadania w zmiennej, a następnie użyj 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}

Możesz również użyć polecenia cmdlet, Get-Job aby pobrać obiekty reprezentujące zadania uruchomione w bieżącej sesji. Get-Job Zwraca ten sam obiekt zadania, który Start-Job zwraca.

POBIERANIE OBIEKTÓW ZADANIA

Aby uzyskać obiekt reprezentujący zadania w tle, które zostały uruchomione w bieżącej sesji, użyj Get-Job polecenia cmdlet. Bez parametrów Get-Job zwraca wszystkie zadania, które zostały uruchomione w bieżącej sesji.

Na przykład następujące polecenie pobiera zadania w bieżącej sesji.

PS C:> Get-Job

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

Można również 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

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

Get-Job

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

UZYSKIWANIE WYNIKÓW ZADANIA

Po uruchomieniu zadania w tle wyniki nie są wyświetlane natychmiast. Zamiast tego Start-Job cmdlet zwraca obiekt zadania, który reprezentuje zadanie, ale nie zawiera wyników. Aby uzyskać wyniki zadania w tle, użyj polecenia cmdlet Receive-Job.

Następujące polecenie używa polecenia cmdlet Receive-Job, aby uzyskać wyniki zadania. Używa obiektu zadania zapisanego w zmiennej $job do identyfikacji zadania.

Receive-Job -Job $job

Polecenie cmdlet Receive-Job zwraca wyniki zadania.

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

$results = Receive-Job -Job $job

Wyniki zadania można zapisać w pliku przy użyciu operatora przekierowania (>) lub polecenia cmdlet Out-File. Poniższe polecenie używa operatora przekierowania do zapisania wyników zadania w zmiennej $job w pliku Results.txt.

Receive-Job -Job $job > results.txt

UZYSKIWANIE I PRZECHOWYWANIE CZĘŚCIOWYCH WYNIKÓW ZADANIA

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

Gdy Receive-Job zwraca wyniki, domyślnie usuwa te wyniki z pamięci podręcznej, w której są przechowywane wyniki zadania. Jeśli uruchomisz inne Receive-Job polecenie, otrzymasz tylko wyniki, które nie zostały jeszcze odebrane.

Następujące polecenia pokazują wyniki Receive-Job poleceń uruchamianych 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

Aby zapobiec Receive-Job usunięciu zwróconych wyników zadania, użyj parametru Keep . W rezultacie Receive-Job zwraca wszystkie wyniki, które zostały wygenerowane do tego czasu.

Poniższe polecenia pokazują efekt użycia parametru Keep na zadanie, 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 trwa długo, możesz użyć właściwości obiektu zadania, aby określić, kiedy zadanie zostało ukończone. Następujące polecenie używa Get-Job obiektu do pobrania wszystkich zadań w tle w bieżącej sesji.

Get-Job

Wyniki są wyświetlane 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 takim przypadku właściwość State ujawnia, że zadanie 2 jest nadal uruchomione. Jeśli chcesz teraz użyć polecenia cmdlet Receive-Job, aby uzyskać wyniki zadania, wyniki będą niekompletne. Aby uzyskać wszystkie wyniki, możesz użyć polecenia cmdlet Receive-Job wielokrotnie. Domyślnie za każdym razem, gdy go używasz, otrzymujesz tylko wyniki, które nie zostały jeszcze odebrane, ale możesz użyć parametru Keep polecenia cmdlet Receive-Job, aby zachować wyniki, nawet jeśli zostały już odebrane.

Wyniki częściowe można zapisać w pliku, a następnie dołączyć nowsze wyniki w miarę ich nadejścia lub poczekać i sprawdzić stan zadania później.

Możesz użyć parametru Receive-Job Wait polecenia cmdlet, które nie zwraca wiersza polecenia, dopóki zadanie nie zostanie ukończone i wszystkie wyniki nie będą dostępne.

Możesz również użyć polecenia cmdlet Wait-Job, aby poczekać na dowolne lub wszystkie wyniki zadania. Wait-Job Umożliwia oczekiwanie na określone zadanie, na wszystkie zadania lub na zakończenie dowolnego z zadań.

Poniższe polecenie używa Wait-Job cmdlet do oczekiwania 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 czasu. To polecenie używa parametru Timeout, aby ograniczyć czas oczekiwania do 120 sekund. Po wygaśnięciu czasu zostanie zwrócony 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 polecenia cmdlet Stop-Job. Następujące polecenie uruchamia zadanie umożliwiające pobranie każdego wpisu 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 (|) do wysłania zadania w zmiennej $job do Stop-Job.

$job | Stop-Job

USUWANIE ZADANIA

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

Remove-Job -Job $job

BADANIE ZADANIA, KTÓRE ZAKOŃCZYŁO SIĘ NIEPOWODZENIEM

Aby dowiedzieć się, dlaczego zadanie zakończyło się niepowodzeniem, użyj podwłaściwości Przyczyna obiektu zadania.

Następujące polecenie uruchamia zadanie bez wymaganych poświadczeń. Zapisuje obiekt zadania w zmiennej $job.

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

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

Następujące polecenie używa właściwości Reason w celu znalezienia błędu, 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. Wartość właściwości Reason jest następująca:

Nawiązywanie połączenia z serwerem zdalnym nie powiodło się z powodu następującego komunikatu o błędzie: Odmowa dostępu.

ZOBACZ TEŻ

o_Pracy_Zdalnej

about_Job_Details

o_zdalny

Informacje_o_PSSessions

Start-Job

Pobieranie zadania

Odbierz-Zadanie

Zatrzymaj-Zadanie

czekaj-zadanie

Usuń-Zadanie

Invoke-Command (Wywołanie-polecenia)