Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使使用try/catch也会停止执行Powershell异常_Powershell_Azure Pipelines - Fatal编程技术网

即使使用try/catch也会停止执行Powershell异常

即使使用try/catch也会停止执行Powershell异常,powershell,azure-pipelines,Powershell,Azure Pipelines,我们有一个在管道中执行的powershell脚本,它有一些命令,如果发生任何错误,这些命令都不会停止。我尝试将脚本块放入try/catch中,但管道仍因错误而停止: 代码如下: try { az network dns record-set txt add-record ` -g $ResourceGroup ` -n "asuid.$DomainName" ` -v $V

我们有一个在管道中执行的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中任务失败的部分:

-任务:AzureCLI@2
名称:创建\u dns\u记录
displayName:“在DNS区域上为CNAME和TXT创建DNS记录”
投入:
azureSubscription:“某些azure订阅”
脚本类型:“pscore”
scriptLocation:“inlineScript”
inlineScript:|
. $(System.DefaultWorkingDirectory)/cd/NewDNSRecordSet.ps1
新DNSRecordSet`
-资源组“RGU区域”`
-域名“$(域名)”`
-区域“$(dns_区域)”`
-验证ID'$(验证ID)'`
-别名“$(defaultHostName)”验证ID和defaultHostName作为任务CreateInfrastructure.ps1的输出
以下是管道的输出:

正在为“mytest.dev”区域创建DNS记录集。
添加txt记录:asuid.mytest
ResourceNotFoundError:找不到资源组“RGU区域”。
创建CNAME记录:mytest
ResourceNotFoundError:找不到资源组“RGU区域”。
警告:无法创建DNS记录。
##[错误]脚本失败,退出代码:1

为了测试我的假设,我在PowerShell中本地编写了以下代码:

$ErrorActionPreference = 'Stop'

try {
    & 'az' @('group', 'show', '--name', 'foo')

    Write-Host "in try: $LASTEXITCODE"
}
catch {
    $_
    Write-Host "in catch: $LASTEXITCODE"
}
我得到输出:

Resource group 'foo' could not be found.
in try: 3
因此,
az
命令失败,退出代码为非零,但没有抛出错误。try块执行良好,脚本结束


如果在管道中运行,非零出口代码将导致管道失败。我的建议是为在PowerShell中执行az CLI命令创建某种帮助器方法,验证
$LASTEXITCODE
,然后自己抛出一个错误,以便以后可以捕获它。

这3个命令中的哪一个失败?是第一个吗?如果是第一个命令,那么其他两个命令会被执行吗?通常
az
命令是幂等的。ony故障是最后一个,因为
$record
为空。这是一个空引用异常。我添加了一个
if($record)
,但管道仍然会因错误而停止。这是因为
$LASTEXITCODE
自动变量。您还应该设置
$ErrorActionPreference='Stop'
,但我不想停止,管道应该继续
$ErrorActionPreference='Stop'
将使我的管道停止如果设置为
Continue/SilentlyContinue
则会引发错误的命令运行正常,这意味着如果try块中有可能引发错误的内容,它将永远不会进入catch块。从我在你的帖子中看到的情况来看,这正是你意想不到的。首先在本地测试您的脚本。这是一个很好的测试。我认为错误在于Azure DevOps中的
AzureCLI
任务,因此我不明白AzureCLI任务在幕后做什么。试一试就可以了。我将用yaml部分更新我的线程。