Powershell Start-Process cmdlet无法在TFS Powershell脚本中运行

时间:2019-03-25 22:45:02

标签: powershell tfs tfsbuild tfs2017 start-process

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 cmdletStart-Job cmdlet

我认为我一直非常努力地缩小这一范围,而且似乎在构建过程中从脚本内部启动一个单独的脚本有些事情。

为什么会这样,并且有办法解决吗?

我确实想知道它是否与基本脚本策略有关,例如在试图运行我们包含within the build的PowerShell脚本的批处理文件中。有可能吗?

1 个答案:

答案 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。

相关问题