使用TFS构建触发时,在Powershell中抑制sqlpackage.exe警告/错误

hit*_*tch 5 tfsbuild powershell-3.0 sql-server-data-tools

我有一个自动部署脚本,使用dacpac和sqlpackage.exe,SSRS报告和网站部署数据库更改.

当我在命令行执行脚本时,sqlpackage输出以下消息:

对象[objectname]已存在于具有不同定义的数据库中,不会被更改.

控制台上的输出为黄色,表示它是警告,部署继续并按预期完成.

但是,当我通过TFS构建触发相同的脚本时,Build Explorer中会记录相同的消息,但旁边会显示错误图标.部署仍在继续,自动化测试运行等,但构建状态更改为带有勾号并交叉的图标 - 表示构建已成功完成,但其他任务失败.

有一个参数可以提供给sqlpackage,UnmodifiableObjectWarnings,它应该可以抑制这种警告,但msdn上有一个帖子表明这个参数存在错误,但它不起作用.

我想知道在Powershell中我是如何陷阱并抑制这种警告的,因为我不希望我的构建/部署因为这个警告而失败.但是我无法抑制对sqlpackage的所有错误输出,因为可能存在其他完全有效的错误.

更新

我已尝试按照以下建议:https: //serverfault.com/questions/340711/redirect-stderr-to-variable-in-powershell 并尝试使用类似于以下代码:

  try {
        $test = & "C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /SourceFile:"$dacpac" /Profile:"$dbProfile" /p:UnmodifiableObjectWarnings=True /Action:Publish 2>&1

        $errMsg = $test | ?{$_.gettype().Name -eq "ErrorRecord"}
        $normMsg = $test | ?{$_.gettype().Name -ne "ErrorRecord"}
    }
    catch {
         Write-Host "Caught Exception $_"
    }
Run Code Online (Sandbox Code Playgroud)

但是,只要exe返回警告消息,我的调用函数就会抛出并处理异常 - 并且不会发生部署.

但是,如果我将其称为如下:

try {
    & "C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /SourceFile:"$dacpac" /Profile:"$dbProfile" /p:UnmodifiableObjectWarnings=True /Action:Publish 2>&1
}
catch {
     Write-Host "Caught Exception $_"
}
Run Code Online (Sandbox Code Playgroud)

即没有变量$ test capture输出,部署成功完成,但catch仍然捕获相同的异常.为什么捕获变量中的输出会导致异常立即被抛出,但是捕获它仍然会导致它被捕获,但是在成功完成之后?

sco*_*pio 0

首先,您需要捕获exe(SQLPackage)的退出代码而不是输出;example1example2可能有帮助

然后您需要捕获标准错误和输出,这里是示例

现在您只需要记录输出(如果需要)并检查退出代码是否非零,然后引发异常