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
. Это возможно?