2015-07-23 3 views
3

Я пишу сценарий для развертывания кучи sql-файлов на сервере sql. Требования:сценарий выхода после записи ошибки в журнал

  1. Все должно быть записано в лог-файл
  2. Сценарий должен заканчиваться при возникновении ошибки (логика фиксируем его затем повторно запустить скрипт еще раз).

У меня есть функция, которая запускает кучу sql-файлов из папки.

function writeLog($comment, 
        $logfile="C:\Users\ndefontenay\Documents\Releases\logs\release-update.log"){ 
    $date=Get-Date -Format "MM/dd/yyyy HH:mm:ss" 
    $fullComment="$date - $comment" 
    $fullComment | Out-File -Append $logfile 
} 

function runQueriesInFolder($folder, $server=".",$database){ 
    Write-Host $folder 
    $files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending 
    foreach ($file in $files){ 
     invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536 
    } 
} 

Это замечательно. Это завершает и записывает некоторые ошибки в консоли. Но мне нужно регистрировать ошибки, поэтому я использую try..catch.

function runQueriesInFolder($folder, $server=".",$database){ 
    Write-Host $folder 
    $files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending 
    try{ 
     foreach ($file in $files){ 
      invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536 
     } 
    } 
    catch{ 
     WriteLog("ERROR - $($_)") 
    } 
} 

Теперь мои ошибки записаны в журналах, но сценарий больше не выходит. Поэтому я пытаюсь использовать выражение «finally». Кажется, он не работает лучше.

function runQueriesInFolder($folder, $server=".",$database){ 
    Write-Host $folder 
    $files=Get-ChildItem -Recurse -Path $folder -Filter "*.sql" | Sort-Object -Descending 
    try{ 
     foreach ($file in $files){ 
      invoke-sqlcmd -InputFile $file.FullName -Database $database -OutputSqlErrors $True -ErrorAction Stop -ServerInstance $server -queryTimeout 65536 
     } 
    } 
    catch{ 
     WriteLog("ERROR - $($_)") 
    } 
    finally{ 
     exit 1 
    } 
} 

Журнал ошибок должен был завершиться при входе первой ошибки Invalid имя объекта:

07/23/2015 10:57:45 - ERROR - Invalid object name 'History.DOS.Test'. 
07/23/2015 10:57:45 - ERROR - Cannot open database "blah" requested by the login. The login failed. 
07/23/2015 10:57:45 - ERROR - The 'Query' and the 'InputFile' options are mutually exclusive. 
07/23/2015 10:57:45 - Release update completed 

Таким образом, вопрос: Как я могу получить мое приложение для входа ошибку остановки в файл и выйти из сценарий полностью?

ответ

2

Теперь мои ошибки записаны в журналах, но сценарий больше не выходит.

Это потому, что ваш блок catch обрабатывает ошибку и не предпринимает никаких действий.

Если вы хотите повторно выдать ошибку, то просто это сделать:

catch{ 
    WriteLog("ERROR - $($_)") 
    throw 
} 

Теперь ошибка будет фиксироваться, а также блок улов будет повторно выдать ошибку, так что пузырьки вверх.

Что касается «пузырящей» ошибки, вызывающий код должен обрабатывать это. Вызывающий код может захотеть обработать соответствующее исключение или просто выйти из сценария.

# calling code 
try { 
    runQueriesInFolder(...) 
} 
catch { 
    # hit an error, don't want to keep script running 
    exit 
} 
+0

Место выхода в «улов». ><Это работает! Почему я не думал об этом Oo ' Большое спасибо. Я думаю, иногда кодирование слишком много облаков умом. –

Смежные вопросы