gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:10:09 25 4
gpt4 key购买 nike

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

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

The object [objectname] already exists in database with a different definition and will not be altered.

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

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

有一个参数可以提供给sqlpackage,UnmodifyingObjectWarnings,它应该可以抑制这种警告,但是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 $_"
}

但是,一旦 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 $_"
}

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

最佳答案

我建议使用最新版本的SqlPackage。看看你的路径,它看起来像是旧版本。很久以前有一个错误,警告被写入 stderr 而不是 stdout。如果升级,问题应该会消失,如果不升级,您可以使用 powershell 启动一个新的 .net 进程,然后您就可以重定向错误输出。

关于tfsbuild - 使用 TFS 构建触发时抑制 Powershell 中的 sqlpackage.exe 警告/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14575734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com