Вы можете заключить каждую из ваших команд в объект или хеш-таблицу с соответствующим действием «отката» и тестом:
$Commands = @(
@{
Action = { Set-Value $PathOne "newValue" }
RollBack = { Set-Value $PathOne "oldValue" }
Test = { Test-Something }
}
@{
Action = { Set-Value $PathTwo "newValue" }
RollBack = { Set-Value $PathTwo "oldValue" }
Test = { Test-Something }
}
)
Затем используйте Stack<Scriptblock>
для отслеживания действий, которые необходимо выполнить в случае «отката»
$RollbackStack = [System.Collections.Generic.Stack[Scriptblock]]::new()
foreach($Command in $Commands){
# Execute command
& $Command.Action
# Add rollback action to stack
$RollbackStack.Push($Command.Rollback)
# Test result, roll back if failed
if(-not(& $Command.Test)){
foreach($rollbackAction in $RollbackStack){
& $rollbackAction
}
}
}