РАЗДЕЛ
    about_Jobs

КРАТКОЕ ОПИСАНИЕ
    Сведения о выполнении команд и выражений в фоновых заданиях Windows 
    PowerShell, не затрагивающем текущий сеанс. 

ПОЛНОЕ ОПИСАНИЕ
    В этом разделе описывается запуск фоновых заданий в Windows 
    PowerShell на локальном компьютере. Дополнительные сведения о 
    запуске фоновых заданий на удаленных компьютерах см. в разделе 
    about_Remote_Jobs. 
    
    При запуске фонового задания командная строка возвращается 
    немедленно, даже если для выполнения задания требуется 
    значительное время. Пока задание выполняется, можно продолжать 
    работу с данным сеансом. 

    Важно: фоновые задания, запущенные с помощью команды Start-Job 
           или параметра AsJob команды Invoke-Command, используют 
           инфраструктуру удаленного взаимодействия Windows PowerShell. 
           Для использования этих функций необходимо настроить в Windows 
           PowerShell удаленное взаимодействие, даже если фоновое задание 
           выполняется только на локальном компьютере. Дополнительные 
           сведения см. в разделе about_Remote_Requirements.

 
        
 ЗАПУСК ЗАДАНИЯ НА ЛОКАЛЬНОМ КОМПЬЮТЕРЕ
    Чтобы запустить фоновое задание на локальном компьютере, 
    используйте командлет Start-Job. 

    При вводе команды Start-Job команда, выполняемая в фоновом задании, 
    заключается в фигурные скобки ( { } ). Для указания команды 
    используйте параметр ScriptBlock.

    Следующая команда запускает фоновое задание, выполняющее команду 
    Get-Process на локальном компьютере.

        start-job -scriptblock {get-process}


    Команда Start-Job возвращает объект, представляющий задание. 
    Объект задания содержит полезные сведения о задании, но не 
    содержит результаты его выполнения.
    
    Сохраните объект задания в переменной, чтобы в дальнейшем 
    использовать его с другими командлетами Job для управления 
    фоновыми заданиями. Следующая команда запускает объект задания и 
    сохраняет результирующий объект задания в переменной $job.

        $job = start-job -scriptblock {get-process} 

    Кроме того, с помощью командлета Get-Job можно получать объекты, 
    представляющие задания, запущенные в текущем сеансе. Командлет 
    Get-Job возвращает тот же объект задания, что и командлет Start-Job.

 
 ПОЛУЧЕНИЕ ОБЪЕКТОВ ЗАДАНИЙ

    Чтобы получить объект, представляющий фоновые задания, запущенные 
    в текущем сеансе, используйте командлет Get-Job. При вызове без 
    параметров команда Get-Job возвращает все задания, запущенные в 
    текущем сеансе.

    Например, следующая команда получает все задания в текущем сеансе.

	get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Running    True         localhost  get-process


    Также можно сохранить объект задания в переменной и использовать  
    его в последующих командах как объект, представляющий это задание. 
    Следующая команда получает задание с идентификатором 1 и сохраняет 
    его в переменной $job.

       $job = get-job -id 1 


    Объект задания содержит состояние задания, показывающее, 
    закончено ли его выполнение. Завершенное задание имеет состояние 
    "Complete" (Выполнено) или "Failed" (Не удалось выполнить). Также 
    задание может быть заблокированным или выполняющимся.


	get-job


        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process



 ПОЛУЧЕНИЕ РЕЗУЛЬТАТОВ ВЫПОЛНЕНИЯ ЗАДАНИЯ

    При выполнении фонового задания результаты появляются не сразу. 
    Вместо этого командлет Start-Job возвращает объект, представляющий это 
    задание, но не содержащий результатов его выполнения. Чтобы получить 
    результаты выполнения фонового задания, используйте командлет Receive-Job.

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

	receive-job -job $job

     Командлет Receive-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
               668       7     2672       6168   104    32.26   488 csrss
	   ...

     Результаты выполнения задания также можно сохранить в 
     переменной. Следующая команда сохраняет результат выполнения задания, 
     размещенного в переменной $job, в переменную $results.

	$results = receive-job -job $job

     Кроме того, результаты выполнения задания можно сохранить в 
     файле с помощью оператора перенаправления (>) или командлета 
     Out-File. В следующей команде с помощью 
     оператора перенаправления результаты выполнения задания из 
     переменной $job сохраняются в файле Results.txt.


        receive-job -job $job > results.txt


    

 ПОЛУЧЕНИЕ И СОХРАНЕНИЕ ЧАСТИЧНЫХ РЕЗУЛЬТАТОВ ВЫПОЛНЕНИЯ ЗАДАНИЙ

    Командлет Receive-Job возвращает результаты выполнения фонового 
    задания. Если задание завершено, командлет Receive-Job возвращает 
    полные результаты его выполнения. Если задание все еще 
    выполняется, командлет Receive-Job получает результаты, созданные 
    на данный момент. Затем можно снова запустить команду Receive-Job для 
    получения оставшихся результатов.

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

    Следующие команды выводят результаты команд Receive-Job, 
    выполненных до завершения задания.


	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


    Чтобы команда Receive-Job не удалила возвращенные ей результаты, 
    используйте параметр Keep. В этом случае команда Receive-Job 
    возвращает все результаты, созданные на данный момент.

    Следующие команды показывают влияние параметра Keep на 
    незавершенное задание. 

        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


    
ОЖИДАНИЕ РЕЗУЛЬТАТОВ

    Если выполнение задания занимает длительное время, можно с 
    помощью свойств объекта задания определить, когда оно будет завершено. 
    Следующая команда с помощью объекта Get-Job получает все фоновые 
    задания в текущем сеансе.

	get-job

    Результаты выводятся в виде таблицы. Состояние задания 
    отображается в столбце "State".

        Id  Name  State      HasMoreData  Location   Command
        --  ----  -----      -----------  --------   -------
        1   Job1  Complete    True         localhost  get-process
        2   Job2  Running     True         localhost  get-eventlog -log syst...
        3   Job3  Complete    True         localhost  dir -path c:\* -recurse


    В этом случае свойство State показывает, что задание Job2 все еще 
    выполняется. Если получить результаты выполнения задания с 
    помощью командлета Receive-Job прямо сейчас, они будут неполными. 
    Можно повторно использовать командлет Receive-Job, пока не будут 
    получены все результаты. По умолчанию при каждом использовании этого 
    командлета получаются только те результаты, которые не были получены 
    ранее, однако с помощью параметра Keep для командлета Receive-Job 
    можно сохранять полученные ранее результаты.

    Теперь можно сохранить результаты в файл и в дальнейшем добавлять 
    в него новые результаты по мере их поступления. Или можно выждать 
    и проверить состояние задания позже.

    Также можно использовать командлет Wait-Job для ожидания любых 
    (или всех) результатов выполнения задания. Командлет Wait-Job 
    позволяет дожидаться выполнения определенного задания, всех 
    заданий или любого из них.
  
    В следующей команде используется командлет Wait-Job для ожидания 
    результатов выполнения задания с идентификатором 10.

	wait-job -ID 10

    При этом командная строка Windows PowerShell отключается до завершения 
    задания.

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

	wait-job -ID 10 -timeout 120


ОСТАНОВКА ЗАДАНИЯ

    Для остановки фоновых заданий используется командлет Stop-Job. 
    Следующая команда запускает задание, получающее все записи из 
    журнала событий System. Объект задания сохраняется в переменной $job.

	$job = start-job -scriptblock {get-eventlog -log system}
 
    Следующая команда останавливает задание. Она передает задание, 
    содержащееся в переменной $job, в командлет Stop-Job с помощью 
    оператора конвейера (|).

	$job | stop-job


УДАЛЕНИЕ ЗАДАНИЯ

    Для удаления фоновых заданий используется командлет Remove-Job. 
    Следующая команда удаляет объект, содержащийся в переменной $job.

	remove-job -job $job 


ПРОВЕРКА ЗАДАНИЯ, В КОТОРОМ ВОЗНИКЛА ОШИБКА

    Чтобы выяснить, почему не удалось выполнить задание, используйте 
    свойство Reason объекта задания.

    Следующая команда запускает задание без требуемых учетных данных. 
    Объект задания сохраняется в переменной $job.


         $job = start-job -scriptblock {new-item -path HKLM:\Software\MyCompany}

         Id   Name  State    HasMoreData  Location   Command
         --   ----  -----    -----------  --------   -------
         1    Job1  Failed   False         localhost  new-item -path HKLM:\S...


    Следующая команда с помощью свойства Reason выясняет причину 
    ошибки, из-за которой не удалось выполнить задание.

         $job.ChildJobs[0].JobStateInfo.Reason


    В данном случае задание не удалось выполнить потому, что 
    удаленный компьютер затребовал явно указанные учетные данные для 
    выполнения команды. При этом свойство Reason имеет следующее значение:

         Не удалось подключиться к удаленному серверу. Сообщение об 
         ошибке: доступ запрещен.


КОМАНДЛЕТЫ JOB

    Start-Job        Запускает фоновое задание на локальном компьютере.
    
    Get-Job          Получает фоновые задания, запущенные в текущем сеансе.
    
    Receive-Job      Получает результаты выполнения фоновых заданий.

    Stop-Job         Останавливает фоновое задание.

    Wait-Job         Отключает командную строку до выполнения 
                     одного задания либо их всех.

    Remove-Job       Удаляет фоновое задание.

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

 
СМ. ТАКЖЕ
   about_Remote_Jobs
   about_Job_Details
   about_Remote
   about_PSSessions  
   Start-Job
   Get-Job
   Receive-Job
   Stop-Job
   Wait-Job
   Remove-Job
   Invoke-Command




Содержание