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 zadanie zajmuje dłuższy czas. 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 tła ampersand (&). 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 określający 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 z programem 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 pliku wykonywalnego, aby można $PSHOME było uruchomić zadanie w tle poza procesem, ale gdy aplikacja hostuje pwsh program PowerShell, jest bezpośrednio przy użyciu pakietów zestawu NuGet SDK programu PowerShell i nie pwsh będzie dostarczana razem.

Element zastępczy w tym scenariuszu pochodzi Start-ThreadJob z modułu 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 pobiera 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-Processuż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 polecenia 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 uruchomionego 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-Jobużywa parametru ScriptBlock, aby uruchomić polecenie, które określaGet-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 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śla Get-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 -Name MapFunctions} -ScriptBlock {
   Get-Map -Name * | Set-Content -Path D:\Maps.tif }

Start-Jobuż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 przetwarzania obiektu wejściowego. Użyj Receive-Job polecenia , aby wyświetlić dane wyjściowe zadania.

Start-Job -ScriptBlock { Get-Content -Path $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 programie Windows PowerShell 5.1

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

$PSVersionTable.PSVersion

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

$job = Start-Job -ScriptBlock { $PSVersionTable.PSVersion } -PSVersion 5.1
Receive-Job -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:

  • Wartość domyślna
  • Podstawowy
  • Credssp
  • Szyfrowane
  • Kerberos
  • Negocjacja
  • NegotiateWithImplicitCredential

Wartość domyślna to Wartość 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.

Uwaga

Uwierzytelnianie dostawcy obsługi zabezpieczeń poświadczeń (CredSSP), w którym poświadczenia użytkownika są przekazywane do komputera zdalnego do uwierzytelnienia, jest przeznaczone dla poleceń wymagających uwierzytelniania w więcej niż jednym zasobie, takich jak uzyskiwanie dostępu do zdalnego udziału sieciowego. Ten mechanizm zwiększa ryzyko bezpieczeństwa operacji zdalnej. W przypadku naruszenia zabezpieczeń komputera zdalnego poświadczenia przekazywane 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 jest 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, które uruchamia to polecenie cmdlet. Użyj tego parametru, aby uruchomić niestandardowe typy zadań, które mają nazwę definicji, taką jak zaplanowane zadania.

Gdy używasz Start-Job polecenia do uruchamiania wystąpienia zaplanowanego zadania, zadanie jest uruchamiane natychmiast, niezależnie od wyzwalaczy zadania 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, które uruchamia 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 ma 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ć jej 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 zmiennej automatycznej $input 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 został wpisany. Znaki nie są interpretowane jako symbole wieloznaczne. Jeśli ścieżka zawiera znaki ucieczki, należy ująć ją w pojedynczy cudzysłów. Pojedyncze znaki 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 zadania, 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, która ma być używana do uruchamiania zadania. Gdy wartość PSVersion to 5.1 Zadanie jest uruchamiane w sesji programu Windows PowerShell 5.1. W przypadku każdej 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) przy użyciu polecenia 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 dla zadań uruchomionych przez Start-Job. Wprowadź niestandardową nazwę typu zadania, na przykład 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ślną lokalizacją jest 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

Do tego polecenia cmdlet można przekazać obiekt z właściwością Name do parametru Name . Na przykład można potokować obiekt FileInfo z pliku Get-ChildItem.

Dane wyjściowe

System.Management.Automation.PSRemotingJob

To polecenie cmdlet zwraca obiekt PSRemotingJob reprezentujący zadanie, które zostało uruchomione.

Uwagi

Program PowerShell zawiera następujące aliasy dla programu Start-Job:

  • Wszystkie platformy:
    • sajb

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 jest uruchamiany w sesji w sesji zdalnej.