Powershell索引数学



我有几个场景,其中一系列任意字符串值具有特定的优先级序列。例如:

forgo > log > assert
exception > failure > error > warning > alert

并且,我需要评估任意数量的场景,这些场景解析到其中一个值并保持运行状态。因此,使用更简单的例子,如果每次求值都是assert,那么最终运行状态将是assert。但如果单个评价为log,其余评价为assert,则最终运行状态为log。单个forgo表示最终状态为forgo,无论单个状态结果的混合是什么。我想提供一个人类可读的运行状态和个人状态,做数学来确定新的运行索引是什么,然后返回人类可读的状态。

所以,我有这个,它可以工作。

$statusIndex = @('assert', 'log', 'forgo')
$runningStatus = 'forgo'
$individualStatus = 'log'
$runningStatusIndex = $statusIndex.indexof($runningStatus)
$individualStatusIndex = $statusIndex.indexof($individualStatus)
if ($individualStatusIndex -gt $runningStatusIndex) {
$runningStatusIndex = $individualStatusIndex
}
$runningStatus = $statusIndex[$runningStatusIndex]

但是,这感觉像是经常发生的事情,可能会有更多的"本地"。就这么办。PowerShell内置的一些功能可以用更少的代码更优雅地处理同样的事情。

我的直觉是正确的,有一种自然的方法吗?或者,也许有一种比这里更优雅的方法?

将您的术语按优先顺序放入数组中:

$statusIndex = @('forgo', 'log', 'assert')

汇总所有状态值并删除任何重复值:

$statusValues = 'assert', 'assert', 'log', 'assert' 
$statusValueSet = $statusValues |Sort -Unique

现在使用.Where()扩展方法从优先级列表中只选择第一个匹配项:

$overallStatus = $statusIndex.Where({$_ -in $statusValueSet}, 'First')

$overallStatus的值现在应该是'log'了。

用3-4行代码代替9-10行:)

最新更新