Командлет Powershell Start-Process не работает из сценария TFS Powershell - PullRequest
1 голос
/ 26 марта 2019

VS / TFS 2017 Этот пост был обновлен для отражения новой информации

Есть 2 сценария PowerShell:

p1.ps1
p2.ps1 

p1 выполняется как задача PowerShell в процессе сборки TFS. p2 используется дважды в пределах p1.

Использование 1: p2 равно called from p1, что означает, что p2 выполняется inline

Использование 2: p2 равно launched from p1, что означает, что p1 выполняет fire and forget выполнение p2, то есть в качестве фоновой задачи.

В процессе сборки TFS использование 1 работает точно так же, как ожидалось, использование 2 не работает.

В конце p1 находятся следующие 2 различных набора кода, которые были предприняты для fire and forget выполнения p2:

$powershellArguments = "-file C:\conf\p2.ps1" , "refresh" , "C:\agent\_work\4\a\for-deploy\website\"
Start-Process powershell.exe -Argument $powershellArguments

And the 2nd methodology:

Start-Job -FilePath $baseFolder"p2.ps1" -ArgumentList "refresh", $sourceRoot

Если я вручную выполню p1 в Command Prompt PowerShell Window, выполнение fire and forget p2 произойдет, как и ожидалось, с любым из указанных выше наборов кода.

Но когда я запускаю сборку и p1 выполняется как a task within the build, p2 не fire and forget. Опять же, для ясности, в сборке TFS процесс 1 inline * выполняется правильно.

В начале скрипта я добавил код для написания небольшого текстового файла, чтобы убедиться, что скрипт, по крайней мере, запущен, и код также записывает полученные аргументы, чтобы убедиться, что синтаксис аргументов был использован правильно. Аргументы передаются p2 правильно, когда p1 выполняется outside of the build environment. Но когда p1 выполняется как сценарий PowerShell within the build, небольшой текстовый файл не отражает того, что p2 даже запускался в режиме fire and forget.

Оказывается, что p1 и p2 - это один и тот же скрипт, они просто используют переключатели для выполнения немного по-разному. Но я скопировал p1 и назвал его p2, чтобы отделить 2 сценария, и результат тот же. Я не могу заставить p2 начать использовать Start-Process cmdlet или Start-Job cmdlet, когда p1 выполняет within the build.

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

Почему это может быть и есть ли способ обойти это?

Мне было интересно, относится ли это к основным политикам сценариев, например, к пакетному файлу, который пытается запустить сценарий PowerShell, для которого мы включаем -executionpolicy remotesigned. Это возможно?

1 Ответ

1 голос
/ 13 мая 2019

@ Шайик-Абрамчик в комментариях был прав.При использовании Start-Job, если сеанс PowerShell завершается, все выполняющиеся задания, запущенные с помощью Start-Job, также прекращаются.

Есть несколько способов выполнить то, что вы хотите.Это зависит от вашего конкретного сценария.Вы можете использовать Register-ScheduledJob или Start-Process.Я думаю, вы вероятно хотите Start-Process:

Start-Process PowerShell.exe -ArgumentList "-NonInteractive", "-NoLogo", "-File", ".\$(Join-Path $baseFolder p2.ps1)", 
 "refresh", "$sourceRoot" -NoNewWindow

HTH.

...