Подавление предупреждений/ошибок sqlpackage.exe в Powershell при запуске с помощью сборки TFS

У меня есть сценарий автоматического развертывания для развертывания изменений базы данных с использованием 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 по-прежнему перехватывает то же самое исключение. Почему захват вывода в переменной приводит к немедленному генерированию исключения, однако его отсутствие по-прежнему приводит к его перехвату, но после успешного завершения?


person hitch    schedule 29.01.2013    source источник


Ответы (2)


Я предлагаю использовать последнюю версию SqlPackage. Глядя на ваш путь, он выглядит как более старая версия. Давным-давно была ошибка, из-за которой предупреждения записывались в stderr вместо stdout. если вы обновите, проблема должна исчезнуть, если вы этого не сделаете, вы можете использовать powershell для запуска нового процесса .net, где у вас будет возможность перенаправить вывод ошибок.

person Eugene Niemand    schedule 15.09.2016

Сначала вам нужно захватить код выхода exe (SQLPackage) вместо вывода; example1 и example2 могут помочь

Затем вам нужно зафиксировать стандартную ошибку и вывод, для этого здесь пример

Теперь вам просто нужно зарегистрировать вывод (если требуется) и проверить, не равен ли код выхода нулю, а затем вызвать исключение

person scorpio    schedule 07.05.2013