gpt4 book ai didi

powershell - 执行命令不会导致脚本异常

转载 作者:行者123 更新时间:2023-12-03 01:13:46 27 4
gpt4 key购买 nike

我们有一个部署数据库脚本的 powershell 脚本。但是,如果数据库脚本失败,则输出不会向 powershell 脚本抛出异常。

以下是 .ps1 文件的示例:

function Publish-DatabaseProject 
{
sqlcmd -S . -b -v DatabaseName=Integration -q "alter table xx add test Varchar(10)"
}

function Add-Timestamp {
process {
if ($_.GetType() -eq [string]) {
"[$(Get-Date -Format o)] $_"
} else {
$_
}
}
}

function Write-LogFile {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)] [string] $Path,
[Parameter(Mandatory=$true, ValueFromPipeline=$true)] [object[]] $InputObject
)

begin {
$root = Split-Path -Path $Path -Parent
if ($root -and !(Test-Path -Path $root)) { New-Item -Path $root -Type Directory
| Out-Null }
}

process {
$InputObject |
Add-Timestamp |
Tee-Object -File $Path -Append
}
}

Publish-DatabaseProject -ErrorVariable DeployError 2>&1 |
Write-LogFile -Path "C:\output.log"

if ($DeployError -and $DeployError.Count -ne 0)
{
Write-Output "Failed"
} else
{
Write-Output "Succeeded"
}

有问题的查询正在针对不存在的表执行。文本输出显示:

[2015-12-11T14:42:45.1973944+00:00] Msg 4902, Level 16, State 1, Server ABDN-DEV-PC1, Line 1

[2015-12-11T14:42:45.2053944+00:00] Cannot find the object "xx" because it does not exist or you do not have permission s.

Succeeded



我期待最后一行阅读:失败。

如果您自己运行 sqlcmd 行,并使用 $LastExitCode 跟进它,它确实会吐出一个非零退出代码。
> sqlcmd -S . -b -v DatabaseName=Integration -q "alter table xx add test Varchar(10)"
Msg 4902, Level 16, State 1, Server ABDN-DEV-PC1, Line 1
Cannot find the object "xx" because it does not exist or you do not have permissions.
> $LastExitCode
1

由于各种原因,我们不能使用 Invoke-SqlCmd ,并且需要坚持使用 SQLCMD.exe。

我们如何才能使 SQLCMD 中的异常正确地冒泡到调用脚本?

最佳答案

您的 -ErrorVariable DeployError只有在 Publish-DatabaseProject 时才会触发语句。 cmdlet 本身无法执行。由于该函数主要是 sqlcmd.exe 的包装器,因此没有任何智能可以冒泡此错误。我们可以使用 $LastExitCode 来包装它。自动变量。

function Publish-DatabaseProject 
{
sqlcmd -S . -b -v DatabaseName=Integration -q "alter table xx add test Varchar(10)"
if ($LastExitCode -ne 0)
{
Write-error $LastExitCode

throw $LastExitCode
}
}

现在,PowerShell 将从 .exe 中捕获此错误,您可以使用 -ErrorVariable .

更新

因此,由于您希望在遇到错误时继续运行而不是弃船,我们需要包装您的 Publish-DataBaseProject带有 try{}catch{} 的函数 block ,在不停止执行的情况下捕获我们正在生成的错误。
try {Publish-DatabaseProject -ErrorAction STOP -ErrorVariable DeployError 2>&1 |
Write-LogFile -Path "C:\output.log" }


catch{
Write-Output "Current job $($_), failed"
Write-Output "Exception $($Error.ExceptionID)"
}

现在我们正确地从 CMD 生成异常,通过我们的函数将其冒泡,并像处理普通函数一样处理它,所有这些都使用 native PowerShell。我相信这就是你想要做的。如果没有,请发布整个脚本的要点,我将以更有针对性的方式为您提供帮助。

关于powershell - 执行命令不会导致脚本异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34226155/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com