Я пишу сценарий для развертывания кучи sql-файлов на сервере sql. Требования:сценарий выхода после записи ошибки в журнал
- Все должно быть записано в лог-файл
- Сценарий должен заканчиваться при возникновении ошибки (логика фиксируем его затем повторно запустить скрипт еще раз).
У меня есть функция, которая запускает кучу 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
Таким образом, вопрос: Как я могу получить мое приложение для входа ошибку остановки в файл и выйти из сценарий полностью?
Место выхода в «улов». ><Это работает! Почему я не думал об этом Oo ' Большое спасибо. Я думаю, иногда кодирование слишком много облаков умом. –