问题描述
我正在尝试使通过手动调用从属脚本执行的任务自动化,我不想进行过多的修改,而需要保留手动使用此功能的能力。 / 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
。
我尝试了$?在每个作用域结束之后,但是这同样是由非终止错误触发的,所以我找不到区别的方法。
另一种选择是在到达那里时将所有内容简单地包装在try
和throw 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 (将#修改为@)