Start-Job

Uruchamia zadanie w tle programu PowerShell.

Składnia

Start-Job
     [-Name <String>]
     [-ScriptBlock] <ScriptBlock>
     [-Credential <PSCredential>]
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-WorkingDirectory <String>]
     [-RunAs32]
     [-PSVersion <Version>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [<CommonParameters>]
Start-Job
     [-DefinitionName] <String>
     [[-DefinitionPath] <String>]
     [[-Type] <String>]
     [-WorkingDirectory <String>]
     [<CommonParameters>]
Start-Job
     [-Name <String>]
     [-Credential <PSCredential>]
     [-FilePath] <String>
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-WorkingDirectory <String>]
     [-RunAs32]
     [-PSVersion <Version>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [<CommonParameters>]
Start-Job
     [-Name <String>]
     [-Credential <PSCredential>]
     -LiteralPath <String>
     [-Authentication <AuthenticationMechanism>]
     [[-InitializationScript] <ScriptBlock>]
     [-WorkingDirectory <String>]
     [-RunAs32]
     [-PSVersion <Version>]
     [-InputObject <PSObject>]
     [-ArgumentList <Object[]>]
     [<CommonParameters>]

Opis

Polecenie Start-Job cmdlet uruchamia zadanie w tle programu PowerShell na komputerze lokalnym.

Zadanie w tle programu PowerShell uruchamia polecenie bez interakcji z bieżącą sesją. Po uruchomieniu zadania w tle obiekt zadania jest zwracany natychmiast, nawet jeśli ukończenie zadania trwa dłużej. Możesz kontynuować pracę w sesji bez przerwy podczas uruchamiania zadania.

Obiekt zadania zawiera przydatne informacje o zadaniu, ale nie zawiera wyników zadania. Po zakończeniu zadania użyj Receive-Job polecenia cmdlet , aby uzyskać wyniki zadania. Aby uzyskać więcej informacji na temat zadań w tle, zobacz about_Jobs.

Aby uruchomić zadanie w tle na komputerze zdalnym, użyj parametru AsJob dostępnego w wielu poleceniach cmdlet lub użyj Invoke-Command polecenia cmdlet , aby uruchomić Start-Job polecenie na komputerze zdalnym. Aby uzyskać więcej informacji, zobacz about_Remote_Jobs.

Począwszy od programu PowerShell 3.0, Start-Job można uruchamiać wystąpienia niestandardowych typów zadań, takich jak zaplanowane zadania. Aby uzyskać informacje o sposobie uruchamiania Start-Job zadań z typami niestandardowymi, zobacz dokumenty pomocy dotyczące funkcji typu zadania.

Począwszy od programu PowerShell 6.0, można uruchamiać zadania przy użyciu operatora ampersand (&) w tle. Funkcjonalność operatora w tle jest podobna do Start-Job. Obie metody uruchamiania zadania tworzą obiekt zadania PSRemotingJob . Aby uzyskać więcej informacji na temat korzystania z ampersand (&), zobacz about_Operators.

Program PowerShell 7 wprowadził parametr WorkingDirectory , który określa początkowy katalog roboczy zadania w tle. Jeśli parametr nie zostanie określony, Start-Job wartość domyślna to bieżący katalog roboczy obiektu wywołującego, który uruchomił zadanie.

Uwaga

Tworzenie zadania w tle poza procesem Start-Job nie jest obsługiwane w scenariuszu, w którym program PowerShell jest hostowany w innych aplikacjach, takich jak program PowerShell Azure Functions.

Jest to zgodnie z projektem, ponieważ Start-Job zależy od pwsh pliku wykonywalnego, który ma być dostępny w obszarze $PSHOME w celu rozpoczęcia zadania w tle poza procesem, ale gdy aplikacja hostuje program PowerShell, jest bezpośrednio przy użyciu pakietów zestawu SDK NuGet programu PowerShell i nie pwsh będzie dostarczana razem.

Substytutem w tym scenariuszu jest Start-ThreadJob moduł ThreadJob.

Przykłady

Przykład 1. Uruchamianie zadania w tle

W tym przykładzie uruchamia się zadanie w tle uruchamiane na komputerze lokalnym.

Start-Job -ScriptBlock { Get-Process -Name pwsh }

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

Start-Job używa parametru ScriptBlock do uruchamiania Get-Process jako zadania w tle. Parametr Name określa, aby znaleźć procesy programu PowerShell, pwsh. Zostaną wyświetlone informacje o zadaniu, a program PowerShell powróci do monitu, gdy zadanie jest uruchamiane w tle.

Aby wyświetlić dane wyjściowe zadania, użyj Receive-Job polecenia cmdlet . Na przykład Receive-Job -Id 1.

Przykład 2. Uruchamianie zadania w tle przy użyciu operatora w tle

W tym przykładzie użyto operatora ampersand (&) w tle, aby uruchomić zadanie w tle na komputerze lokalnym. Zadanie otrzymuje ten sam wynik, co Start-Job w przykładzie 1.

Get-Process -Name pwsh &

Id    Name   PSJobTypeName   State       HasMoreData     Location      Command
--    ----   -------------   -----       -----------     --------      -------
5     Job5   BackgroundJob   Running     True            localhost     Microsoft.PowerShell.Man...

Get-Process używa parametru Name do określania procesów programu PowerShell, pwsh. Ampersand (&) uruchamia polecenie jako zadanie w tle. Zostaną wyświetlone informacje o zadaniu, a program PowerShell powróci do monitu, gdy zadanie jest uruchamiane w tle.

Aby wyświetlić dane wyjściowe zadania, użyj Receive-Job polecenia cmdlet . Na przykład Receive-Job -Id 5.

Przykład 3. Uruchamianie zadania przy użyciu Invoke-Command

W tym przykładzie uruchomiono zadanie na wielu komputerach. Zadanie jest przechowywane w zmiennej i jest wykonywane przy użyciu nazwy zmiennej w wierszu polecenia programu PowerShell.

$jobWRM = Invoke-Command -ComputerName (Get-Content -Path C:\Servers.txt) -ScriptBlock {
   Get-Service -Name WinRM } -JobName WinRM -ThrottleLimit 16 -AsJob

Zadanie, które używa Invoke-Command , jest tworzone i przechowywane w zmiennej $jobWRM . Invoke-Command używa parametru ComputerName , aby określić komputery, na których jest uruchamiane zadanie. Get-Content pobiera nazwy serwerów C:\Servers.txt z pliku.

Parametr ScriptBlock określa polecenie, które Get-Service pobiera usługę WinRM. Parametr JobName określa przyjazną nazwę zadania WinRM. Parametr ThrottleLimit ogranicza liczbę współbieżnych poleceń do 16. Parametr AsJob uruchamia zadanie w tle, które uruchamia polecenie na serwerach.

Przykład 4. Pobieranie informacji o zadaniu

Ten przykład pobiera informacje o zadaniu i wyświetla wyniki ukończonego zadania, które zostało uruchomione na komputerze lokalnym.

$j = Start-Job -ScriptBlock { Get-WinEvent -Log System } -Credential Domain01\User01
$j | Select-Object -Property *

State         : Completed
HasMoreData   : True
StatusMessage :
Location      : localhost
Command       : Get-WinEvent -Log System
JobStateInfo  : Completed
Finished      : System.Threading.ManualResetEvent
InstanceId    : 27ce3fd9-40ed-488a-99e5-679cd91b9dd3
Id            : 18
Name          : Job18
ChildJobs     : {Job19}
PSBeginTime   : 8/8/2019 14:41:57
PSEndTime     : 8/8/2019 14:42:07
PSJobTypeName : BackgroundJob
Output        : {}
Error         : {}
Progress      : {}
Verbose       : {}
Debug         : {}
Warning       : {}
Information   : {}

Start-Job używa parametru ScriptBlock , aby uruchomić polecenie, które określa Get-WinEvent , aby uzyskać dziennik systemu . Parametr Credential określa konto użytkownika domeny z uprawnieniami do uruchamiania zadania na komputerze. Obiekt zadania jest przechowywany w zmiennej $j .

Obiekt w zmiennej $j jest wysyłany w dół potoku do elementu Select-Object. Parametr Property określa gwiazdkę (*), aby wyświetlić wszystkie właściwości obiektu zadania.

Przykład 5. Uruchamianie skryptu jako zadania w tle

W tym przykładzie skrypt na komputerze lokalnym jest uruchamiany jako zadanie w tle.

Start-Job -FilePath C:\Scripts\Sample.ps1

Start-Job Używa parametru FilePath do określenia pliku skryptu przechowywanego na komputerze lokalnym.

Przykład 6. Pobieranie procesu przy użyciu zadania w tle

W tym przykładzie użyto zadania w tle, aby uzyskać określony proces według nazwy.

Start-Job -Name PShellJob -ScriptBlock { Get-Process -Name PowerShell }

Start-Job używa parametru Name , aby określić przyjazną nazwę zadania PShellJob. Parametr ScriptBlock określaGet-Process, aby pobrać procesy o nazwie programu PowerShell.

Przykład 7. Zbieranie i zapisywanie danych przy użyciu zadania w tle

W tym przykładzie uruchamia się zadanie, które zbiera dużą ilość danych mapy, a następnie zapisuje je w .tif pliku.

Start-Job -Name GetMappingFiles -InitializationScript {Import-Module MapFunctions} -ScriptBlock {
   Get-Map -Name * | Set-Content -Path D:\Maps.tif }

Start-Job używa parametru Name , aby określić przyjazną nazwę zadania GetMappingFiles. Parametr InitializationScript uruchamia blok skryptu, który importuje moduł MapFunctions . Parametr ScriptBlock jest uruchamiany Get-Map i Set-Content zapisuje dane w lokalizacji określonej przez parametr Path .

Przykład 8. Przekazywanie danych wejściowych do zadania w tle

W tym przykładzie użyto zmiennej automatycznej $input do przetworzenia obiektu wejściowego. Użyj polecenia Receive-Job , aby wyświetlić dane wyjściowe zadania.

Start-Job -ScriptBlock { Get-Content $input } -InputObject "C:\Servers.txt"
Receive-Job -Name Job45 -Keep

Server01
Server02
Server03
Server04

Start-Job używa parametru ScriptBlock do uruchomienia Get-Content z zmienną automatyczną $input . Zmienna $input pobiera obiekty z parametru InputObject . Receive-Job używa parametru Name , aby określić zadanie i wyświetlić wyniki. Parametr Keep zapisuje dane wyjściowe zadania, aby można było je wyświetlić ponownie podczas sesji programu PowerShell.

Przykład 9: Ustawianie katalogu roboczego dla zadania w tle

Folder WorkingDirectory umożliwia określenie alternatywnego katalogu dla zadania, z którego można uruchamiać skrypty lub otwierać pliki. W tym przykładzie zadanie w tle określa katalog roboczy inny niż bieżąca lokalizacja katalogu.

PS C:\Test> Start-Job -WorkingDirectory C:\Test\Scripts { $PWD } | Receive-Job -AutoRemoveJob -Wait

Path
----
C:\Test\Scripts

Bieżący katalog roboczy tego przykładu to C:\Test. Start-Job Używa parametru WorkingDirectory do określenia katalogu roboczego zadania. Parametr ScriptBlock służy $PWD do wyświetlania katalogu roboczego zadania. Receive-Job wyświetla dane wyjściowe zadania w tle. Funkcja AutoRemoveJob usuwa zadanie i funkcja Wait pomija wiersz polecenia do momentu odebrania wszystkich wyników.

Przykład 10: użyj parametru ArgumentList, aby określić tablicę

W tym przykładzie użyto parametru ArgumentList do określenia tablicy argumentów. Tablica jest rozdzielaną przecinkami listą nazw procesów.

Start-Job -ScriptBlock { Get-Process -Name $args } -ArgumentList powershell, pwsh, notepad

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

Polecenie Start-Job cmdlet używa parametru ScriptBlock do uruchomienia polecenia. Get-Process używa parametru Name , aby określić zmienną $argsautomatyczną . Parametr ArgumentList przekazuje tablicę nazw procesów do .$args Nazwy procesów programu PowerShell, pwsh i Notatnika są procesami uruchomionymi na komputerze lokalnym.

Aby wyświetlić dane wyjściowe zadania, użyj Receive-Job polecenia cmdlet . Na przykład Receive-Job -Id 1.

Przykład 11: Uruchamianie zadania w Windows PowerShell 5.1

W tym przykładzie użyto parametru PSVersion z wartością 5.1 do uruchomienia zadania w sesji Windows PowerShell 5.1.

$PSVersionTable.PSVersion

Major  Minor  Patch  PreReleaseLabel BuildLabel
-----  -----  -----  --------------- ----------
7      0      0      rc.1

$job = Start-Job { $PSVersionTable.PSVersion } -PSVersion 5.1
Receive-Job $job

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14393  3383

Parametry

-ArgumentList

Określa tablicę argumentów lub wartości parametrów dla skryptu określonego przez parametr FilePath lub polecenie określone za pomocą parametru ScriptBlock .

Argumenty muszą być przekazywane do argumentu ArgumentList jako argument tablicy jednowymiarowej. Na przykład lista rozdzielona przecinkami. Aby uzyskać więcej informacji na temat zachowania argumentlist, zobacz about_Splatting.

Type:Object[]
Aliases:Args
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Authentication

Określa mechanizm używany do uwierzytelniania poświadczeń użytkownika.

Dopuszczalne wartości tego parametru są następujące:

  • Domyślny
  • Podstawowa
  • Credssp
  • Szyfrowane
  • Kerberos
  • Negotiate
  • NegotiateWithImplicitCredential

Wartość domyślna to Domyślna.

Uwierzytelnianie CredSSP jest dostępne tylko w systemach Windows Vista, Windows Server 2008 i nowszych wersjach systemu operacyjnego Windows.

Aby uzyskać więcej informacji na temat wartości tego parametru, zobacz AuthenticationMechanism.

Przestroga

Uwierzytelnianie dostawcy obsługi zabezpieczeń poświadczeń (CredSSP), w którym poświadczenia użytkownika są przekazywane do komputera zdalnego do uwierzytelnienia, jest przeznaczone do poleceń wymagających uwierzytelniania w więcej niż jednym zasobie, na przykład uzyskiwania dostępu do udziału sieci zdalnej. Ten mechanizm zwiększa ryzyko bezpieczeństwa operacji zdalnej. Jeśli bezpieczeństwo komputera zdalnego zostanie naruszone, poświadczenia przekazane do niego mogą służyć do kontrolowania sesji sieciowej.

Type:AuthenticationMechanism
Accepted values:Default, Basic, Negotiate, NegotiateWithImplicitCredential, Credssp, Digest, Kerberos
Position:Named
Default value:Default
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-Credential

Określa konto użytkownika, które ma uprawnienia do wykonania tej akcji. Jeśli parametr Credential nie zostanie określony, polecenie używa poświadczeń bieżącego użytkownika.

Wpisz nazwę użytkownika, taką jak User01 lub Domain01\User01, lub wprowadź obiekt PSCredential wygenerowany przez Get-Credential polecenie cmdlet. Jeśli wpiszesz nazwę użytkownika, zostanie wyświetlony monit o wprowadzenie hasła.

Poświadczenia są przechowywane w obiekcie PSCredential , a hasło jest przechowywane jako secureString.

Uwaga

Aby uzyskać więcej informacji na temat ochrony danych secureString , zobacz Jak bezpieczny jest protokół SecureString?.

Type:PSCredential
Position:Named
Default value:Current user
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-DefinitionName

Określa nazwę definicji zadania uruchamianego przez to polecenie cmdlet. Użyj tego parametru, aby uruchomić niestandardowe typy zadań, które mają nazwę definicji, na przykład zaplanowane zadania.

Gdy używasz polecenia Start-Job do uruchamiania wystąpienia zaplanowanego zadania, zadanie jest uruchamiane natychmiast, niezależnie od wyzwalaczy zadań lub opcji zadania. Wynikowe wystąpienie zadania jest zaplanowanym zadaniem, ale nie jest zapisywane na dysku, takie jak wyzwalane zaplanowane zadania. Nie można użyć parametru ArgumentList parametru , Start-Job aby podać wartości parametrów skryptów uruchamianych w zaplanowanym zadaniu.

Ten parametr został wprowadzony w programie PowerShell 3.0.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-DefinitionPath

Określa ścieżkę definicji zadania uruchamianego przez to polecenie cmdlet. Wprowadź ścieżkę definicji. Łączenie wartości parametrów DefinitionPath i DefinitionName jest w pełni kwalifikowaną ścieżką definicji zadania. Użyj tego parametru, aby uruchomić niestandardowe typy zadań, które mają ścieżkę definicji, taką jak zaplanowane zadania.

W przypadku zaplanowanych zadań wartość parametru DefinitionPath to $home\AppData\Local\Windows\PowerShell\ScheduledJob.

Ten parametr został wprowadzony w programie PowerShell 3.0.

Type:String
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-FilePath

Określa skrypt lokalny, który Start-Job jest uruchamiany jako zadanie w tle. Wprowadź ścieżkę i nazwę pliku skryptu lub użyj potoku, aby wysłać ścieżkę skryptu do Start-Job. Skrypt musi znajdować się na komputerze lokalnym lub w folderze, do którego może uzyskiwać dostęp komputer lokalny.

W przypadku użycia tego parametru program PowerShell konwertuje zawartość określonego pliku skryptu na blok skryptu i uruchamia blok skryptu jako zadanie w tle.

Type:String
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-InitializationScript

Określa polecenia uruchamiane przed uruchomieniem zadania. Aby utworzyć blok skryptu, należy ująć polecenia w nawiasy klamrowe ({}).

Użyj tego parametru, aby przygotować sesję, w której jest uruchamiane zadanie. Można na przykład użyć go do dodawania funkcji, przystawek i modułów do sesji.

Type:ScriptBlock
Position:1
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-InputObject

Określa dane wejściowe polecenia. Wprowadź zmienną zawierającą obiekty lub wpisz polecenie lub wyrażenie, które generuje obiekty.

W wartości parametru ScriptBlock użyj $input zmiennej automatycznej do reprezentowania obiektów wejściowych.

Type:PSObject
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-LiteralPath

Określa skrypt lokalny, który to polecenie cmdlet jest uruchamiane jako zadanie w tle. Wprowadź ścieżkę skryptu na komputerze lokalnym.

Start-Job używa wartości parametru LiteralPath dokładnie tak, jak jest on wpisany. Znaki wieloznaczne nie są interpretowane jako znaki wieloznaczne. Jeśli ścieżka zawiera znaki ucieczki, należy je ująć w pojedynczy cudzysłów. Znaki pojedynczego cudzysłowu informują program PowerShell, aby nie interpretował żadnych znaków jako sekwencji ucieczki.

Type:String
Aliases:PSPath, LP
Position:Named
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Name

Określa przyjazną nazwę nowego zadania. Możesz użyć nazwy, aby zidentyfikować zadanie do innych poleceń cmdlet zadań, takich jak Stop-Job polecenie cmdlet.

Domyślna przyjazna nazwa to Job#, gdzie # jest liczbą porządkową, która jest zwiększana dla każdego zadania.

Type:String
Position:Named
Default value:None
Required:False
Accept pipeline input:True
Accept wildcard characters:False

-PSVersion

Określa wersję programu PowerShell do użycia do uruchamiania zadania. Gdy wartość psVersion to 5.1 Zadanie jest uruchamiane w sesji Windows PowerShell 5.1. W przypadku dowolnej innej wartości zadanie jest uruchamiane przy użyciu bieżącej wersji programu PowerShell.

Ten parametr został dodany w programie PowerShell 7 i działa tylko w systemie Windows.

Type:Version
Position:Named
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-RunAs32

Począwszy od programu PowerShell 7, parametr RunAs32 nie działa w 64-bitowym programie PowerShell (pwsh). Jeśli parametr RunAs32 jest określony w 64-bitowym programie PowerShell, Start-Job zgłasza błąd wyjątku zakończenia. Aby uruchomić 32-bitowy proces programu PowerShell (pwsh) z programem RunAs32, musisz mieć zainstalowany 32-bitowy program PowerShell.

W 32-bitowym programie PowerShell polecenie RunAs32 wymusza uruchomienie zadania w 32-bitowym procesie, nawet w 64-bitowym systemie operacyjnym.

W 64-bitowych wersjach systemów Windows 7 i Windows Server 2008 R2, gdy Start-Job polecenie zawiera parametr RunAs32 , nie można użyć parametru Credential w celu określenia poświadczeń innego użytkownika.

Type:SwitchParameter
Position:Named
Default value:False
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-ScriptBlock

Określa polecenia do uruchomienia w zadaniu w tle. Aby utworzyć blok skryptu, należy ująć polecenia w nawiasy klamrowe ({}). Użyj zmiennej automatycznej, $input aby uzyskać dostęp do wartości parametru InputObject . Ten parametr jest wymagany.

Type:ScriptBlock
Aliases:Command
Position:0
Default value:None
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Type

Określa typ niestandardowy zadań uruchomionych przez Start-Jobprogram . Wprowadź niestandardową nazwę typu zadania, taką jak PSScheduledJob dla zaplanowanych zadań lub zadania PSWorkflowJob dla zadań przepływów pracy. Ten parametr nie jest prawidłowy dla standardowych zadań w tle.

Ten parametr został wprowadzony w programie PowerShell 3.0.

Type:String
Position:2
Default value:None
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-WorkingDirectory

Określa początkowy katalog roboczy zadania w tle. Jeśli parametr nie zostanie określony, zadanie zostanie uruchomione z lokalizacji domyślnej. Domyślna lokalizacja to bieżący katalog roboczy obiektu wywołującego, który uruchomił zadanie.

Ten parametr został wprowadzony w programie PowerShell 7.

Type:String
Position:Named
Default value:$HOME on Unix (macOS, Linux) and $HOME\Documents on Windows
Required:False
Accept pipeline input:False
Accept wildcard characters:False

Dane wejściowe

String

Możesz użyć potoku, aby wysłać obiekt z właściwością Name do parametru Name . Na przykład można potokować obiekt FileInfo z Get-ChildItem do .Start-Job

Dane wyjściowe

System.Management.Automation.PSRemotingJob

Start-Job Zwraca obiekt PSRemotingJob reprezentujący zadanie, które zostało uruchomione.

Uwagi

Aby uruchomić w tle, Start-Job działa we własnej sesji w bieżącej sesji. Gdy używasz Invoke-Command polecenia cmdlet do uruchamiania Start-Job polecenia w sesji na komputerze zdalnym, Start-Job działa w sesji w sesji zdalnej.