繁体   English   中英

Powershell Start-Process cmdlet 无法在 TFS Powershell 脚本中工作

[英]Powershell Start-Process cmdlet not working from within a TFS Powershell script

VS / TFS 2017此帖子已更新以反映新信息

有 2 个 PowerShell 脚本:

p1.ps1
p2.ps1 

p1 在 TFS 构建过程中作为 PowerShell 任务执行。 p2 在 p1 中使用了两次。

使用 1: called from p1 p2 ,意味着 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

如果我在Command Prompt PowerShell Window手动执行 p1 ,则上面的任一组代码都会按预期执行fire and forget p2 执行。

但是当我运行构建并且 p1 作为a task within the build执行时,p2 不会fire and forget 同样,要明确的是,在 TFS 构建中, use 1 inline进程确实正确执行。

在脚本的开头,我嵌入了一些代码来编写一个小文本文件,以确认脚本至少正在启动,并且代码还写出收到的参数以确保正确使用了参数语法。 当 p1 outside of the build environment执行时,参数会正确传递给 p2。 但是,当P1为PowerShell脚本执行within the build ,小的文本文件并不反映P2甚至在开始fire and forget模式。

事实证明 p1 和 p2 是同一个脚本,它们只是使用开关来执行略有不同。 但是我复制了 p1 并将其命名为 p2 只是为了将 2 个脚本分开,结果是相同的。 当 p1 within the build执行时,我无法让 p2 开始使用Start-Process cmdletStart-Job cmdlet

我想我一直很努力地缩小范围,似乎有一些关于从构建过程中的脚本中启动单独的脚本的事情。

为什么会这样,有没有办法解决这个问题?

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

评论中的@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

哈。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM