Поделиться через


Start-Job

Запускает фоновое задание PowerShell.

Синтаксис

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>]

Описание

Командлет Start-Job запускает фоновое задание PowerShell на локальном компьютере.

Фоновое задание PowerShell выполняет команду без взаимодействия с текущим сеансом. При запуске фонового задания объект задания возвращается немедленно, даже если для выполнения задания требуется более длительное время. Пока задание выполняется, можно продолжать работу с данным сеансом.

Объект job содержит полезные сведения о задании, но не содержит результаты задания. По завершении задания используйте Receive-Job командлет , чтобы получить результаты задания. Дополнительные сведения о фоновых заданиях см. в разделе about_Jobs.

Чтобы запустить фоновое задание на удаленном компьютере, используйте параметр AsJob , доступный во многих командлетах, или Invoke-Command командлет для выполнения Start-Job команды на удаленном компьютере. Дополнительные сведения см. в разделе about_Remote_Jobs.

Начиная с PowerShell 3.0, Start-Job может запускать экземпляры пользовательских типов заданий, таких как запланированные задания. Сведения о том, как использовать Start-Job для запуска заданий с пользовательскими типами, см. в справочных документах по функции типа задания.

Начиная с PowerShell 6.0 можно запускать задания с помощью фонового оператора амперсанд (&). Функциональность фонового оператора аналогична Start-Jobфункции . Оба метода запуска задания создают объект задания PSRemotingJob . Дополнительные сведения об использовании амперсанда (&) см. в разделе about_Operators.

В PowerShell 7 появился параметр WorkingDirectory , указывающий начальный рабочий каталог фонового задания. Если параметр не указан, Start-Job по умолчанию используется текущий рабочий каталог вызывающей стороны, которая запустила задание.

Примечание

Создание фонового задания вне процесса с помощью Start-Job не поддерживается в сценарии, в котором PowerShell размещается в других приложениях, таких как Функции Azure PowerShell.

Это связано с тем, что Start-Job для запуска фонового задания вне процесса зависит от pwsh того, в котором будет доступен $PSHOME исполняемый файл, но когда приложение размещает PowerShell, оно напрямую использует пакеты SDK NuGet для PowerShell и не pwsh будет поставляться вместе.

Замена в этом сценарии выполняется Start-ThreadJob из модуля ThreadJob.

Примеры

Пример 1. Запуск фонового задания

В этом примере запускается фоновое задание, которое выполняется на локальном компьютере.

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 использует параметр ScriptBlock для запуска Get-Process в качестве фонового задания. Параметр Name указывает для поиска процессов PowerShell, pwsh. Отобразятся сведения о задании, и PowerShell возвращается в запрос, пока задание выполняется в фоновом режиме.

Чтобы просмотреть выходные данные задания, используйте Receive-Job командлет . Например, Receive-Job -Id 1.

Пример 2. Использование фонового оператора для запуска фонового задания

В этом примере фоновый оператор амперсанда (&) используется для запуска фонового задания на локальном компьютере. Задание получает тот же результат, что и Start-Job в примере 1.

Get-Process -Name pwsh &

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

Get-Process использует параметр Name для указания процессов PowerShell, pwsh. Амперсанд (&) выполняет команду в качестве фонового задания. Отобразятся сведения о задании, и PowerShell возвращается в запрос, пока задание выполняется в фоновом режиме.

Чтобы просмотреть выходные данные задания, используйте Receive-Job командлет . Например, Receive-Job -Id 5.

Пример 3. Запуск задания с помощью Invoke-Command

В этом примере выполняется задание на нескольких компьютерах. Задание хранится в переменной и выполняется с помощью имени переменной в командной строке PowerShell.

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

Задание, использующее Invoke-Command , создается и сохраняется в переменной $jobWRM . Invoke-Command использует параметр ComputerName , чтобы указать компьютеры, на которых выполняется задание. Get-Content получает имена серверов из C:\Servers.txt файла .

Параметр ScriptBlock указывает команду, которая Get-Service получает службу WinRM . Параметр JobName указывает понятное имя задания — WinRM. Параметр ThrottleLimit ограничивает количество одновременных команд до 16. Параметр AsJob запускает фоновое задание, которое выполняет команду на серверах.

Пример 4. Получение сведений о задании

Этот пример получает сведения о задании и отображает результаты завершенного задания, которое было выполнено на локальном компьютере.

$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 использует параметр ScriptBlock для выполнения команды, указывающей Get-WinEvent для получения системного журнала. Параметр Credential указывает учетную запись пользователя домена с разрешением на выполнение задания на компьютере. Объект задания хранится в переменной $j .

Объект в переменной $j отправляется по конвейеру в Select-Object. Параметр Property указывает звездочку (*) для отображения всех свойств объекта задания.

Пример 5. Запуск скрипта в качестве фонового задания

В этом примере скрипт на локальном компьютере выполняется в качестве фонового задания.

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

Start-Job использует параметр FilePath для указания файла скрипта, хранящегося на локальном компьютере.

Пример 6. Получение процесса с помощью фонового задания

В этом примере используется фоновое задание для получения указанного процесса по имени.

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

Start-Job использует параметр Name , чтобы указать понятное имя задания PShellJob. Параметр ScriptBlock указывает Get-Process для получения процессов с именем PowerShell.

Пример 7. Сбор и сохранение данных с помощью фонового задания

В этом примере запускается задание, которое собирает большой объем данных карты, а затем сохраняет их в .tif файле.

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

Start-Job использует параметр Name для указания понятного имени задания GetMappingFiles. Параметр InitializationScript запускает блок скрипта, который импортирует модуль MapFunctions . Параметр ScriptBlock запускается Get-Map и Set-Content сохраняет данные в расположении, указанном параметром Path .

Пример 8. Передача входных данных в фоновое задание

В этом примере используется $input автоматическая переменная для обработки входного объекта. Используйте Receive-Job для просмотра выходных данных задания.

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

Server01
Server02
Server03
Server04

Start-Job использует параметр ScriptBlock для запуска Get-Content с автоматической переменной $input . Переменная $input получает объекты из параметра InputObject . Receive-Job использует параметр Name для указания задания и выводит результаты. Параметр Keep сохраняет выходные данные задания, чтобы их можно было просмотреть снова во время сеанса PowerShell.

Пример 9. Задание рабочего каталога для фонового задания

WorkingDirectory позволяет указать альтернативный каталог для задания, из которого можно запускать скрипты или открывать файлы. В этом примере фоновое задание указывает рабочий каталог, который отличается от текущего расположения каталога.

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

Path
----
C:\Test\Scripts

Текущий рабочий каталог этого примера — C:\Test. Start-Job использует параметр WorkingDirectory для указания рабочего каталога задания. Параметр ScriptBlock использует для $PWD отображения рабочего каталога задания. Receive-Job отображает выходные данные фонового задания. AutoRemoveJob удаляет задание, а ожидание отключает командную строку, пока не будут получены все результаты.

Пример 10. Использование параметра ArgumentList для указания массива

В этом примере используется параметр ArgumentList для указания массива аргументов. Массив представляет собой разделенный запятыми список имен процессов.

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

Командлет Start-Job использует параметр ScriptBlock для выполнения команды. Get-Process использует параметр Name для указания автоматической переменной $args. Параметр ArgumentList передает массив имен процессов в $args. Имена процессов powershell, pwsh и Блокнот — это процессы, выполняемые на локальном компьютере.

Чтобы просмотреть выходные данные задания, используйте Receive-Job командлет . Например, Receive-Job -Id 1.

Пример 11. Выполнение задания в Windows PowerShell 5.1

В этом примере используется параметр PSVersion со значением 5.1 для выполнения задания в сеансе 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

Параметры

-ArgumentList

Задает массив аргументов или значений параметров для скрипта, указанного параметром FilePath , или командой, указанной с помощью параметра ScriptBlock .

Аргументы должны передаваться в ArgumentList в качестве аргумента массива с одним измерением. Например, список, разделенный запятыми. Дополнительные сведения о поведении ArgumentList см. в разделе about_Splatting.

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

-Authentication

Указывает механизм, используемый для проверки подлинности учетных данных пользователя.

Ниже приведены допустимые значения для этого параметра.

  • Default
  • Basic
  • Credssp
  • Digest (дайджест)
  • Kerberos
  • Согласование
  • NegotiateWithImplicitCredential

Значение по умолчанию — Default.

Проверка подлинности CredSSP доступна только в Windows Vista, Windows Server 2008 и более поздних версиях операционной системы Windows.

Дополнительные сведения о значениях этого параметра см. в разделе AuthenticationMechanism.

Внимание!

Аутентификация CredSSP, в рамках которой учетные данные пользователя передаются на удаленный компьютер для проверки, предназначена для команд, требующих аутентификацию нескольких ресурсов, например для доступа к удаленной сетевой папке. Этот механизм повышает риск безопасности удаленной операции. Если удаленный компьютер скомпрометирован, учетные данные, передаваемые ему, могут использоваться для управления сетевым сеансом.

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

Указывает учетную запись пользователя с разрешением на выполнение этого действия. Если параметр Credential не указан, команда использует учетные данные текущего пользователя.

Введите имя пользователя, например User01 или Domain01\User01, или введите объект PSCredential , созданный командлетом Get-Credential . Если ввести имя пользователя, вам будет предложено ввести пароль.

Учетные данные хранятся в объекте PSCredential , а пароль хранится как SecureString.

Примечание

Дополнительные сведения о защите данных SecureString см. в разделе Как безопасно secure is SecureString?.

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

-DefinitionName

Указывает имя определения задания, запускаемого этим командлетом. Используйте этот параметр для запуска заданий настраиваемых типов, имеющих имя определения, например запланированных заданий.

При использовании для Start-Job запуска экземпляра запланированного задания задание запускается немедленно, независимо от триггеров и параметров задания. Результирующий экземпляр задания является запланированным заданием, но он не сохраняется на диске, как запущенные запланированные задания. Параметр ArgumentList нельзя использовать для предоставления значений Start-Job параметров скриптов, которые выполняются в запланированном задании.

Этот параметр появился в PowerShell 3.0.

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

-DefinitionPath

Указывает путь к определению для задания, запускаемого этим командлетом. Введите путь определения. Объединение значений параметров DefinitionPath и DefinitionName — это полный путь к определению задания. Используйте этот параметр для запуска заданий настраиваемых типов, которые имеют путь к определению, например запланированных заданий.

Для запланированных заданий значение параметра DefinitionPath равно $HOME\AppData\Local\Windows\PowerShell\ScheduledJob.

Этот параметр появился в PowerShell 3.0.

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

-FilePath

Задает локальный скрипт, который Start-Job выполняется в качестве фонового задания. Введите путь и имя файла скрипта или используйте конвейер для отправки пути к скрипту Start-Jobв . Сценарий должен находиться на локальном компьютере или в папке, доступ к которым имеет локальный компьютер.

При использовании этого параметра PowerShell преобразует содержимое указанного файла скрипта в блок скрипта и запускает его в качестве фонового задания.

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

-InitializationScript

Указывает команды, выполняемые перед запуском задания. Чтобы создать блок скрипта, заключите команды в фигурные скобки ({}).

Используйте этот параметр для подготовки сеанса, в рамках которого выполняется задание. Например, его можно использовать для добавления в сеанс функций, оснасток и модулей.

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

-InputObject

Указывает входные данные команды. Введите переменную, содержащую объекты, либо введите команду или выражение для создания объектов.

В значении параметра ScriptBlock используйте автоматическую $input переменную для представления входных объектов.

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

-LiteralPath

Указывает локальный скрипт, который этот командлет выполняет в качестве фонового задания. Введите путь к скрипту на локальном компьютере.

Start-Job использует значение параметра LiteralPath в том виде, в котором он введен. Никакие символы не распознаются как подстановочные знаки. Если путь содержит escape-символы, заключите его в одинарные кавычки. Одинарные кавычки предписывают PowerShell не интерпретировать какие-либо символы как escape-последовательности.

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

-Name

Указывает понятное имя нового задания. Имя можно использовать для идентификации задания в других командлетах задания, таких как Stop-Job командлет .

Понятное имя по умолчанию — Job#, где # — порядковый номер, который увеличивается для каждого задания.

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

-PSVersion

Указывает версию PowerShell, используемую для выполнения задания. Если значение PSVersion равно 5.1, задание выполняется в сеансе Windows PowerShell 5.1. Для любого другого значения задание выполняется с помощью текущей версии PowerShell.

Этот параметр был добавлен в PowerShell 7 и работает только в Windows.

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

-RunAs32

Начиная с PowerShell 7 параметр RunAs32 не работает в 64-разрядной версии PowerShell (pwsh). Если параметр RunAs32 указан в 64-разрядной версии PowerShell, Start-Job возникает неустранимая ошибка исключения. Чтобы запустить 32-разрядный процесс PowerShell (pwsh) с помощью RunAs32, необходимо установить 32-разрядную версию PowerShell.

В 32-разрядной версии PowerShell RunAs32 выполняет задание в 32-разрядном процессе даже в 64-разрядной операционной системе.

В 64-разрядных версиях Windows 7 и Windows Server 2008 R2, если Start-Job команда включает параметр RunAs32 , нельзя использовать параметр Credential для указания учетных данных другого пользователя.

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

-ScriptBlock

Указывает команды, которые нужно выполнить в фоновом задании. Чтобы создать блок скрипта, заключите команды в фигурные скобки ({}). Используйте автоматическую $input переменную для доступа к значению параметра InputObject . Это обязательный параметр.

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

-Type

Указывает пользовательский тип для заданий, запущенных .Start-Job Введите имя настраиваемого типа задания, например PSScheduledJob для запланированных заданий или PSWorkflowJob для заданий рабочих процессов. Этот параметр недопустим для стандартных фоновых заданий.

Этот параметр появился в PowerShell 3.0.

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

-WorkingDirectory

Указывает начальный рабочий каталог фонового задания. Если параметр не указан, задание выполняется из расположения по умолчанию. Расположением по умолчанию является текущий рабочий каталог вызывающей стороны, которая запустила задание.

Этот параметр появился в 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

Входные данные

String

Вы можете передать объект со свойством Name в параметр Name для этого командлета. Например, можно передать объект FileInfo по конвейеру из Get-ChildItem.

Выходные данные

System.Management.Automation.PSRemotingJob

Этот командлет возвращает объект PSRemotingJob , представляющий запущенное задание.

Примечания

PowerShell включает следующие псевдонимы для Start-Job:

  • Для всех платформ.
    • sajb

Для запуска в фоновом режиме Start-Job выполняется в собственном сеансе текущего сеанса. При использовании командлета Invoke-Command для выполнения Start-Job команды в сеансе на удаленном компьютере Start-Job выполняется в сеансе удаленного сеанса.