Start-Job запускается только если я жду завершения - PullRequest
1 голос
/ 06 июня 2019

У меня есть 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
}

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

Ответы [ 3 ]

0 голосов
/ 06 июня 2019

Добавить -force:

Start-Job -ScriptBlock {
   New-Item -Path 'c:\ivanti-patch-automation\logs\tempfile.txt' -ItemType File -force
}
0 голосов
/ 07 июня 2019

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

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

По этой же причине ожиданиеПохоже, что дочерняя работа временно разрешила проблему.

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

0 голосов
/ 06 июня 2019

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

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

Start-Job -ScriptBlock $ScriptBlock

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

...