【问题标题】:Using read-host cmdlet when execute powershell script file in MSBuild在 MSBuild 中执行 powershell 脚本文件时使用 read-host cmdlet
【发布时间】:2014-01-03 05:38:26
【问题描述】:

所有,我正在尝试在 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" />

【问题讨论】:

    标签: powershell msbuild cmdlet


    【解决方案1】:

    所以是的,控制台(只是一个小点 - 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)
    }
    

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

    【讨论】:

    • 完美!我没想到在PowerShell 中这样做。谢谢。
    【解决方案2】:

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

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

    【讨论】:

    • 没有 cmd.exe 窗口 - 只是一个控制台窗口;)
    • MSBuild 确实生成了 cmd.exe。见备注:msdn.microsoft.com/en-us/library/x8zx72cd.aspx我也和任务管理器确认了这一点
    • 好的,在这种情况下它是一个父进程。许多人仍然认为所有控制台进程都是 cmd.exe 窗口。
    • If you really need to ask questions, then ask them before calling MSBuild.。是的。我同意你的看法。其实我会这么做的。
    猜你喜欢
    • 2017-06-01
    • 2013-03-16
    • 2014-02-28
    • 2011-06-06
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多