Возобновить при ошибке для Powershell - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий цикл foreach в скрипте powershell:

foreach ($sqlScript in Get-ChildItem -path "$pathToScripts" -Filter *.sql | sort-object) {  
                Write-Host "Running Script " $sqlScript.Name

                #Execute the query
                switch ($removeComments) {
                    $true {
                        (Get-Content $sqlScript.FullName -Encoding UTF8 | Out-String) -replace '(?s)/\*.*?\*/', " " -split '\r?\n\s*go\s*\r\n?' -notmatch '^\s*$' |
                            ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
                    }
                    $false {
                        (Get-Content $sqlScript.FullName -Encoding UTF8 | Out-String) -split '\r?\n\s*go\s*\r\n?' -notmatch '^\s*$' |
                            ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
                    }
                }
            }

Весь скрипт обернут блоком catch / try и работает нормально для ошибок.

Теперь у меня естьтребование, что если один из файлов (сценариев) выдаст ошибку, цикл проигнорирует это и перейдет к следующему файлу.

Могу ли я сделать это с вложенными блоками catch try или есть способ возобновитьцикл на ошибку?

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Добавление дополнительного Try..Catch, вероятно, будет правильным решением.Например, вы можете изменить ваши блоки ForEach-Object следующим образом:

Try {
    $SqlCmd.CommandText = $_.Trim(); 
    $reader = $SqlCmd.ExecuteNonQuery() 
} Catch {
    Write-Error "$($SqlCmd.CommandText) resulted in an error"
    $_
}

Обратите внимание, что $_ в блоке Catch будет содержать произошедшую ошибку.После выполнения Catch остальная часть сценария должна продолжиться как обычно.

0 голосов
/ 16 мая 2018

Используйте предпочтение ErrorAction в качестве SilentlyContinue везде, где есть исполняемый оператор или оператор, который, по вашему мнению, может вызвать ошибку. В вашем текущем скрипте вы можете сделать это -

foreach ($sqlScript in Get-ChildItem -path "$pathToScripts" -Filter *.sql | sort-object)
{  
    Write-Host "Running Script " $sqlScript.Name

    #Execute the query
    switch ($removeComments)
    {
        $true
        {
            (Get-Content $sqlScript.FullName -Encoding UTF8 | Out-String) -replace '(?s)/\*.*?\*/', " " -split '\r?\n\s*go\s*\r\n?' -notmatch '^\s*$'  -ErrorAction SilentlyContinue |
                            ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
        }
        $false
        {
            (Get-Content $sqlScript.FullName -Encoding UTF8 | Out-String) -split '\r?\n\s*go\s*\r\n?' -notmatch '^\s*$'  -ErrorAction SilentlyContinue |
                            ForEach-Object { $SqlCmd.CommandText = $_.Trim(); $reader = $SqlCmd.ExecuteNonQuery() }
        }
    }
}

Подробнее см. , и , .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...