Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 zostanie zwrócony natychmiast, nawet jeśli zadanie potrwa dłuższy czas. Możesz kontynuować pracę w sesji bez przerwy podczas uruchamiania zadania.
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 obiekcie |
bieżąca sesja. | |
Receive-Job |
Pobiera wyniki zadań w tle. |
Stop-Job |
Zatrzymuje zadanie w tle. |
Wait-Job |
Pomija wiersz polecenia do momentu, gdy jedno lub wszystkie zadania zostaną pominięte |
Kompletny. | |
Remove-Job |
Usuwa zadanie w tle. |
Invoke-Command |
Parametr AsJob uruchamia dowolne polecenie jako tło |
zadanie na komputerze zdalnym. Możesz 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, dołącz polecenie 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 Get-Process
polecenie 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, aby zarządzać 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ć Get-Job
polecenia cmdlet , 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 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. Ukończone zadanie ma stan "Ukończono" 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
POBIERANIE WYNIKÓW ZADANIA
Po uruchomieniu zadania w tle wyniki nie są wyświetlane natychmiast.
Zamiast tego polecenie cmdlet Start-Job zwraca obiekt zadania, który reprezentuje zadanie, ale nie zawiera wyników. Aby uzyskać wyniki zadania w tle, użyj Receive-Job
polecenia cmdlet .
Następujące polecenie używa Receive-Job
polecenia cmdlet, aby uzyskać wyniki zadania. Używa obiektu zadania zapisanego w zmiennej $job w celu zidentyfikowania 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
# ...
Możesz również zapisać wyniki zadania w zmiennej. Następujące polecenie zapisuje wyniki zadania w zmiennej $job do zmiennej $results.
$results = Receive-Job -Job $job
Możesz również zapisać wyniki zadania w pliku przy użyciu operatora przekierowania (>) lub polecenia cmdlet Out-File. Następujące polecenie używa operatora przekierowania, aby zapisać wyniki zadania w zmiennej $job w pliku Results.txt.
Receive-Job -Job $job > results.txt
POBIERANIE I UTRZYMYWANIE WYNIKÓW CZĘŚCIOWYCH ZADAŃ
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.
Aby uzyskać pozostałe wyniki, możesz ponownie uruchomić Receive-Job
polecenia.
W Receive-Job
przypadku zwracania wyników 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 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
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 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 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 obiektu, Get-Job
aby pobrać wszystkie zadania 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 tym przypadku właściwość State ujawnia, że zadanie 2 jest nadal uruchomione. Jeśli chcesz użyć Receive-Job
polecenia cmdlet , aby uzyskać wyniki zadania teraz, wyniki będą niekompletne. Możesz wielokrotnie używać Receive-Job
polecenia cmdlet, aby uzyskać wszystkie wyniki. Domyślnie za każdym razem, gdy go używasz, uzyskujesz tylko wyniki, które nie zostały jeszcze odebrane, ale możesz użyć parametru Keep polecenia cmdlet Receive-Job, aby zachować wyniki, mimo że zostały one już odebrane.
Możesz napisać częściowe wyniki do pliku, a następnie dołączyć nowsze wyniki podczas ich nadejścia lub poczekać i sprawdzić stan zadania później.
Możesz użyć parametru Receive-Job
Wait polecenia cmdlet, który nie zwraca wiersza polecenia, dopóki zadanie nie zostanie ukończone, a wszystkie wyniki będą dostępne.
Możesz również użyć Wait-Job
polecenia cmdlet , aby poczekać na dowolne lub wszystkie wyniki zadania. Wait-Job
Umożliwia oczekiwanie na określone zadanie, dla wszystkich zadań lub ukończenie któregokolwiek z zadań.
Następujące polecenie używa polecenia cmdlet Wait-Job 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 Limit czasu, aby ograniczyć czas oczekiwania do 120 sekund. Po wygaśnięciu czasu wiersz polecenia zostanie zwrócony, 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 (|) do wysyłania zadania w zmiennej $job do 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
Aby dowiedzieć się, dlaczego zadanie nie powiodło się, użyj podwłaściwości Reason 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, 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. Wartość właściwości Reason to:
Nawiązywanie połączenia z serwerem zdalnym nie powiodło się z powodu następującego komunikatu o błędzie: Odmowa dostępu.