VS / TFS 2017 此帖子已更新,以反映新信息
有2个PowerShell脚本:
p1.ps1
p2.ps1
p1在TFS生成过程中作为PowerShell任务执行。 p2在p1中使用了两次。
使用1: p2为called from p1
,表示p2已执行inline
使用2: p2为launched from p1
,这意味着p1对p2执行了fire and forget
,即作为后台任务。
在TFS生成过程中,使用1 完全按预期工作,使用2 无效。
在p1末尾附近是尝试{2} {2}执行p2的以下两组不同的代码:
fire and forget
如果我在$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
p2的执行将按预期使用上述两组代码。
但是,当我运行构建并以fire and forget
执行p1时,p2没有a task within the build
。同样,要明确一点,在TFS构建中,使用1 fire and forget
进程 正确执行。
在脚本的开头,我嵌入了一些代码来编写一个小的文本文件,以确认脚本至少已启动,并且代码还会写出接收到的参数,以确保参数语法已正确使用。在执行inline
p1时,参数会正确传递到p2。但是,当将p1作为PowerShell脚本outside of the build environment
执行时,小的文本文件甚至不能以within the build
模式启动该p2。
事实证明p1和p2是相同的脚本,它们只是使用开关来执行稍有不同。但是我复制了p1并将其命名为p2只是为了分隔两个脚本,结果是相同的。当p1执行fire and forget
时,我无法让p2开始使用Start-Process cmdlet
或Start-Job cmdlet
。
我认为我一直非常努力地缩小这一范围,而且似乎在构建过程中从脚本内部启动一个单独的脚本有些事情。
为什么会这样,并且有办法解决吗?
我确实想知道它是否与基本脚本策略有关,例如在试图运行我们包含within the build
的PowerShell脚本的批处理文件中。有可能吗?
答案 0 :(得分:1)
@ Shayik-Abramczyk在评论中是正确的。使用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。