azure cli 不会因 PS 脚本中的错误而停止

use*_*453 5 powershell azure-cli

归结起来,我有一个如下所示的 Powershell 脚本:

$ErrorActionPreference='Stop'
az group deployment create -g ....
# Error in az group
# More az cli commands
Run Code Online (Sandbox Code Playgroud)

即使 az group deployment create 中出现错误,它也会在错误之外继续执行。如何阻止脚本在出错时执行?

HAL*_*256 6

通常,首先要尝试的是将所有内容包装在一个try...catch块中。

try {
    $ErrorActionPreference='Stop'
    az group deployment create -g ....
    # Error in az group
    # More az cli commands
}
catch {
    Write-Host "ERROR: $Error"
}
Run Code Online (Sandbox Code Playgroud)

啊啊啊,这不起作用。

这时您会挠头,意识到我们正在处理Azure CLI命令,而不是Azure PowerShell。它们不是本机 PowerShell 命令$ErrorActionPreference,相反(听起来很糟糕),我们必须独立对待每个 Azure CLI 命令,就好像我们正在运行单独的程序一样(在后端,Azure CLI 基本上是运行的别名) python 命令。具有讽刺意味的是,大多数 Azure PowerShell 命令只是 Azure CLI 命令的 PowerShell 包装器;-))。

我们知道 Azure CLI 不会抛出终止错误,相反,我们必须将其视为程序,并查看返回代码(存储在变量中$LASTEXITCODE)以查看它是否成功。一旦我们评估了这一点,我们就会发现throw一个错误:

az group deployment create -g ....
if($LASTEXITCODE){
    Write-Host "ERROR: in Az Group"
    Throw "ERROR: in Az Group"
}
Run Code Online (Sandbox Code Playgroud)

然后可以将其实现到一个try...catch块中以停止后续命令的运行:

try {
    az group deployment create -g ....
    if($LASTEXITCODE){
        Write-Host "ERROR: in Az Group"
        Throw "ERROR: in Az Group"
    }
    # Error in az group
    # More az cli commands
}
catch {
    Write-Host "ERROR: $Error"
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这意味着您必须$LASTEXITCODE 在每次执行Azure CLI 命令时进行评估。