终止错误时跨机器终止整个管道 PipelineMaster.ps1 PipelineSlave.ps1:

问题描述

我正在尝试使通过手动调用从属脚本执行的任务自动化,我不想进行过多的修改,而需要保留手动使用此功能的能力。 / p>

到目前为止,我设法创建了一个调用脚本,该脚本可以完成我们以前手动执行的操作,但是找不到找到第一个终止错误时结束管道的优雅方法

这个想法是,如果在主节点或从节点的任何地方遇到终止错误,则整个管道将以错误状态终止。

这是我得到的最远的

PipelineMaster.ps1

$groups = (@('server1','server2','server3'),@('server4'))
trap { 
    'trap at master';
    if ($_.FullyQualifiedErrorId -ne 1) { Write-Error -ErrorRecord $_ }
    throw 1 
}

ForEach ($group in $groups) {
    Invoke-Command -ComputerName $group[0] -ArgumentList $group -ScriptBlock {
        param([Parameter(ValueFromremainingArguments = $true)][String[]]$group)
        trap { 
            'trap at invocation';
            if ($_.FullyQualifiedErrorId -ne 1) { Write-Error -ErrorRecord $_ }
            throw 1 
        }
        
        # preparation per group
        .\Pipelineslave.ps1 -group $group
    } 
} 

Pipelineslave.ps1:

param([string[]]$group)
trap { 
    'trap at slave';
    if ($_.FullyQualifiedErrorId -ne 1) { Write-Error -ErrorRecord $_ }
    throw 1 
}

ForEach ($h in $group) {
    Invoke-Command -ComputerName $h -ScriptBlock {
        trap { 
            'trap at node';
            if ($_.FullyQualifiedErrorId -ne 1) { Write-Error -ErrorRecord $_ }
            throw 1
        }
        " ## $(hostname)"
        "minor err"; New-Item -ItemType Directory -Path c:\
        'major err'; New-Item -ItemType Directory -Path c:\temp -ErrorAction Stop
        " ## Done on $(hostname)"
    }
}

这在每个作用域级别都使用trap

我尝试了$?在每个作用域结束之后,但是这同样是由非终止错误触发的,所以我找不到区别的方法

另一种选择是在到达那里时将所有内容简单地包装在trythrow 1中。 附带问题:为什么try{...} catch {throw}的工作方式不同于try{...} catch {throw 1}?前者仅终止上下文,后者仅终止整个管道,我找不到任何解释它的文章

最后,我也对此进行了实验(在此简化):

ForEach ($group in $groups) {
    Invoke-Command -ComputerName $group[0] -ArgumentList $group -ScriptBlock {
        ForEach ($h in $group) {
            Invoke-Command ComputerName $h -ScriptBlock {
                New-Item -ItemType Directory -Path C:\
                New-Item -ItemType Directory -Path C:\temp
                if (!$?) { return 'ERROR' }
                "Done on $(hostname)"
            } | % {if ('ERROR' -eq $_) {return 'ERROR'} else {$_}}
        }
    } | % {if ('ERROR' -eq $_) {return 'ERROR'} else {$_}}
}

这确实达到了我想要的目的,但是我不依赖于终止错误和非终止错误间的本机PS区分,而是需要确保该错误是非终止的,然后检查要终止的每个命令的结果上。

我意识到我也可以执行上述操作,但是可以使用throw 1而不是return 'ERROR',但这很像第一种方法,而且更加乏味。

注意:命令不一定是New-Item,但它们是触发PS中终止和非终止错误的可靠方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...