5

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

在此处输入图像描述

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" />
4

2 回答 2

3

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

# 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捕获您意外调用交互式主机函数的任何其他地方。它不会阻止上述功能的工作。

于 2014-01-05T16:30:47.120 回答
2

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

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

于 2014-01-03T13:58:45.763 回答