【发布时间】:2021-04-20 02:31:45
【问题描述】:
我们有一个在我们的管道中执行的 powershell 脚本,它有一些命令,如果发生任何错误,它们不应停止。我尝试将脚本块放在 try/catch 中,但管道仍然因错误而停止:
这是代码:
try {
az network dns record-set txt add-record `
-g $ResourceGroup `
-n "asuid.$DomainName" `
-v $VerificationId `
-z $Zone
$record = az network dns record-set cname create `
-g $ResourceGroup `
-n $DomainName `
-z $Zone `
-o json | ConvertFrom-Json
az network dns record-set cname set-record `
-g $ResourceGroup `
-n $record.name `
-c $Alias `
-z $Zone
}
catch {
Write-Warning "Creating a DNS record was not possible. Consider creating it by hand or review the error:"
Write-Warning $_
}
我知道一些解决方法,比如告诉管道在出错时继续运行,或者只是使用-ErrorAction Continue 执行 cmdLet,但对我来说,为什么这不能像我一样工作是没有任何意义的。至少对于来自 C# 和其他语言的我来说,如果您不想重新抛出异常,那将是默认行为。
我错过了什么概念?
编辑 1
这是 yaml 中任务失败的部分:
- task: AzureCLI@2
name: create_dns_record
displayName: "Creates a DNS record for CNAME and TXT on DNS Zone"
inputs:
azureSubscription: 'some-azure-subscription'
scriptType: 'pscore'
scriptLocation: 'inlineScript'
inlineScript: |
. $(System.DefaultWorkingDirectory)/cd/NewDNSRecordSet.ps1
New-DNSRecordSet `
-ResourceGroup 'rg_zones' `
-DomainName '$(domain_name)' `
-Zone '$(dns_zone)' `
-VerificationId '$(verificationId)' `
-Alias '$(defaultHostName)' # verificationId and defaultHostName as output from the task CreateInfrastructure.ps1
这是管道的输出:
Creating DNS Recordset for 'mytest.dev' zone.
Adding txt record: asuid.mytest
ResourceNotFoundError: Resource group 'rg_zones' could not be found.
Creating CNAME record: mytest
ResourceNotFoundError: Resource group 'rg_zones' could not be found.
WARNING: Creating a DNS record was not possible.
##[error]Script failed with exit code: 1
【问题讨论】:
-
这 3 个命令中的哪个命令失败?是第一个吗?如果是第一个,其他两个会被处决吗?
-
通常
az命令是幂等的。唯一失败的是最后一个,因为$record是null。这是一个空引用异常。我添加了if ($record)..,但管道仍然因错误而停止。 -
这是因为
$LASTEXITCODE自动变量。您还应该设置$ErrorActionPreference = 'Stop' -
但我不想停止,管道应该继续...
$ErrorActionPreference = 'Stop'会让我的管道停止 -
如果您的 $ErrorActionPreference 设置为
Continue/SilentlyContinue,一个会引发错误的命令反而运行良好,这意味着如果您的 try 块中有某些内容可能 throw,它永远不会进入 catch 块。从我在您的帖子中看到的情况来看,这正是您所不期望的。首先在本地测试您的脚本。
标签: powershell azure-pipelines