У меня есть сценарий автоматического развертывания для развертывания изменений базы данных с использованием dacpac и sqlpackage.exe, отчетов SSRS и веб-сайта.
Когда я запускаю скрипт в командной строке, sqlpackage выводит следующее сообщение:
Объект [имя_объекта] уже существует в базе данных с другим определением и не будет изменен.
Выходные данные отображаются на консоли желтым цветом, указывая на то, что это предупреждение, развертывание продолжается и завершается, как ожидалось.
Однако, когда я запускаю тот же скрипт через сборку TFS, то же сообщение регистрируется в проводнике сборки, но рядом со значком ошибки. Развертывание по-прежнему продолжается, автоматические тесты выполняются и т. д., но статус сборки меняется на значок с галочкой и крестиком, что указывает на то, что сборка завершена успешно, но другие задачи не выполнены.
Существует параметр, который может быть предоставлен 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 $_"
}
однако, как только исполняемый файл возвращает предупреждающее сообщение, выдается исключение и обрабатывается моей вызывающей функцией, и развертывание не происходит.
Однако, если я назову это следующим образом:
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 по-прежнему перехватывает то же самое исключение. Почему захват вывода в переменной приводит к немедленному генерированию исключения, однако его отсутствие по-прежнему приводит к его перехвату, но после успешного завершения?