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

在MSBuild中执行powershell脚本文件时使用read-host cmdlet,powershell,msbuild,cmdlet,Powershell,Msbuild,Cmdlet,总之,我正在尝试在MSBuild中执行外部powershell脚本文件。但每次PS运行cmdlet时,读取主机。MSBuild似乎停止了。不会提示我输入。我不知道会发生什么。控制台似乎处于死锁状态。谢谢 testloop.ps1代码如下所示 $ErrorActionPreference = 'Stop' $error.clear() function GetAzureSubScription() { read-host "please input something :" }

总之,我正在尝试在MSBuild中执行外部powershell脚本文件。但每次PS运行cmdlet时,读取主机
。MSBuild似乎停止了。不会提示我输入。我不知道会发生什么。控制台似乎处于死锁状态。谢谢

testloop.ps1代码如下所示

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


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

write-host "Get into script"

GetAzureSubScription
MSBuild代码如下(为清晰起见,已包装):


MSBuild Exec任务启动cmd.exe并让它执行命令。由于cmd.exe窗口本身不可见,MSbuild必须通过通道将写操作传递到控制台。看来写的东西确实能通过,但读的东西却不行。如果您不调用powershell,而是执行“del c:\temp\somefile.txt/p”这样的命令来请求确认,则可以看到相同的效果。虽然这样它不会阻塞,但也没有办法给出答案

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

是的,控制台(只是一个次要点-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
,以捕获意外调用交互式主机函数的任何其他位置。但它不会停止上述功能的工作。

没有cmd.exe窗口-只有控制台窗口;)MSBuild实际上生成cmd.exe。请参阅备注:我还通过TaskManagerRok确认了这一点,在这种情况下,它是一个父进程。许多人仍然相信所有控制台进程都是cmd.exe窗口。
如果您确实需要提问,请在调用MSBuild之前提问。
。对我同意你的看法。事实上我会这么做的。太好了!我没想到会在
PowerShell
中这样做。谢谢
# 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)
}