在MSBuild中执行powershell脚本文件时使用read-host cmdlet

时间:2014-01-03 05:38:27

标签: powershell msbuild cmdlet

全部,我正在尝试在MSBuild中执行外部电源shell脚本文件。但每当PS运行cmdlet Read-Host时。 MSBuild似乎停止了。并没有提示我输入。我不知道发生了什么事。似乎控制台处于死锁状态。谢谢。

enter image description here

testloop.ps1代码如下所示。

$ErrorActionPreference = 'Stop'
$error.clear()


function GetAzureSubScription()
{
    read-host "please input something :"
} 

write-host "Get into script"

GetAzureSubScription

MSBuild代码如下(为清晰起见而包装):

<Exec WorkingDirectory="$(MSBuildProjectDirectory)" 
    Command="$(windir)\system32\WindowsPowerShell\v1.0\powershell.exe -f
    E:\Work\AutoDeploy\testloop.ps1" />

2 个答案:

答案 0 :(得分:3)

所以,是的,控制台(只是一个小问题 - powershell.exe不在cmd.exe下运行 - 它们是单独的进程,但它们都使用控制台窗口)窗口被隐藏,因此在提示时它会显示为冻结输入。这里最简单的选择是使用将提示使用图形窗口的版本覆盖读取主机功能。添加脚本的开头,添加以下函数:

# override the built in prompting, just for this script
function read-host($prompt) {
    $x = 0; $y = 0;
    add-type -assemblyname microsoft.visualbasic
    [Microsoft.VisualBasic.Interaction]::InputBox($prompt,
        "Interactive", "(default value)", $x, $y)
}

现在您的脚本将能够提示输入值。此外,您应该使用powershell.exe参数运行-noninteractive以捕获您不小心调用交互式主机功能的任何其他位置。它不会阻止上述功能工作。

答案 1 :(得分:1)

MSBuild Exec任务启动cmd.exe并让它执行命令。由于cmd.exe窗口本身不可见,因此MSbuild必须将写入通道传递给控制台。似乎写入确实通过,但读取没有。您可以看到相同的效果,如果不是调用powershell,而是执行像“del c:\ temp \ somefile.txt / p”这样要求确认的命令。虽然这种方式不会阻止,但也无法给出答案。

它不能正确处理读取并不奇怪。它是一个构建脚本,所以它应该只是构建而不是提问。我的建议是让MSBuild脚本在不问问题的情况下运行。如果您确实需要提问,请在致电MSBuild之前询问他们。