这个问题与这里的问题有关:
使用 TFS 构建触发时抑制 Powershell 中的 sqlpackage.exe 警告/错误
但是,我正在开发的解决方法有问题,如下所示
try {
& "C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /SourceFile:"$dacpac" /Profile:"$dbProfile" /p:UnmodifiableObjectWarnings=false /Action:Publish 2>&1
}
catch {
Write-Host "Exception: $_"
if($_.TargetObject -like $Pattern) {
Write-Host "Known exception - treat as warning"
}
if($LastExitCode -ne 0) {
throw "An error occurred deploying database. Please examine the log to determine the nature of the error"
}
}
如果我不将 stderr 重定向到 stdout,则当 sqlpackage 记录警告时,该过程指示失败。
如果我在上一个命令中将 stderr 重定向到 stdout,则当 sqlpackage.exe 引发警告时,进程能够完成,但一旦完成,就会引发异常。然后我可以检查异常文本,它与我已知的异常相同,我可以放心地忽略它。
但是,sqlpackage 会记录除警告之外的某些内容-即实际的失败错误,我无法确定异常的附加文本。在 catch 里面,我能看到的只是警告信息。如果我删除 stderr 重定向,则会记录完整的输出,这是与权限相关的错误。
因此,我的脚本在它应该成功的时候成功了,并且忽略了我不关心它的警告。当我想要它时它也会失败,但是我不能输出适当的日志消息。然后我需要编辑我的部署脚本,重新运行部署等等,所有这些都非常繁琐,而且不可重复。
任何提示将不胜感激。