Start-Job запускается, только если я жду завершения

У меня есть Start-Job -ScriptBlock, который будет работать правильно, если я дождусь завершения задания. Если я не ожидаю / не получаю статус завершения задания, -ScriptBlock не запускается. Я не уверен, что мне не хватает. Скорее всего, вы не понимаете фундаментального поведения фоновых заданий PS.

Это работает на сервере Win 2012R2. Вот мой дамп $ PSVersionTable:

Name                           Value                                                                 
----                           -----                                                                 
PSVersion                      5.0.10586.117                                                         
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                               
BuildVersion                   10.0.10586.117                                                        
CLRVersion                     4.0.30319.42000                                                       
WSManStackVersion              3.0                                                                   
PSRemotingProtocolVersion      2.3                                                                   
SerializationVersion           1.1.0.1  

Я пробовал размещать тесты до и после -ScriptBlock, чтобы отловить другие ошибки, но весь -ScriptBlock, похоже, вообще не работает.

Например, в моей настройке в настоящее время работает следующее:

Start-Job -ScriptBlock {
   New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File
} | Wait-Job

Файл создан правильно.

Следующее не работает. Единственное изменение - удаление команды конвейера Wait-Job.

Start-Job -ScriptBlock {
   New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File
}

Я ожидал, что оба будут работать, и не уверен, почему ожидание завершения работы влияет на то, работает оно или нет.


person Joey    schedule 06.06.2019    source источник
comment
Что делает ваш сеанс PowerShell после начала работы? Выполнение другой команды, возврат к приглашению или она просто завершается?   -  person user4003407    schedule 06.06.2019
comment
Самый подходящий комментарий, я бы поддержал, но пока у меня недостаточно репутации. Спасибо PetSerAl.   -  person Joey    schedule 07.06.2019


Ответы (3)


Хммм, я не могу воспроизвести это. Но я на 5.1. Можете ли вы попробовать поместить блок сценария в переменную и передать ее в задание. Нравиться

$ScriptBlock = {
   New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File
}

Start-Job -ScriptBlock $ScriptBlock

Посмотрите, создаст ли это работу.

person Sid    schedule 06.06.2019

Добавить -force:

Start-Job -ScriptBlock {
   New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File -force
}
person icey    schedule 06.06.2019

Я нашел ответ несколько минут назад. Первый комментарий PetSerAI немного намекал на это, хотя впоследствии я обнаружил ответ самостоятельно, проведя исследования.

В этом случае родительский сеанс PS (a) инициировал фоновое задание (b) через Start-Job. Задание (b) начиналось, но до того, как у него появилась возможность обработать самую первую строку в задании (b), родительский сеанс PS (a) продолжился, завершив его выполнение и полностью завершив этот сеанс. Поскольку задания, порожденные сеансами PS, обычно не превосходят своих родителей, фоновое дочернее задание (b), которое я начал, было немедленно прекращено и никогда не обрабатывало ни одной строки в нем.

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

Учитывая, что это проблема, создание фонового задания любым способом, который дольше родительского, решит это в моем случае. Я собираюсь продолжить использование Start-Process, чтобы вместо этого создать новый процесс PowerShell, который переживет родительский процесс. Это должно решить проблему для меня.

person Joey    schedule 07.06.2019
comment
Я приму это как правильный ответ, когда сработает таймер блокировки. - person Joey; 07.06.2019