我有3个需要同步运行的powershell命令,因为我需要将输出从1号传递到2号,依此类推。但是,如果有任何失败,我需要退出所有3。是否甚至有cmdlet或技术可以在powershell中启用此行为?
答案 0 :(得分:2)
通常,PowerShell命令不支持“回退”或“回滚”。注册表提供程序确实支持事务(这将允许这种行为),但仅支持涉及注册表的操作。
也许可以在命令中捕获要更新的事物的状态并重新应用这些状态,但这将是一个非常手动的过程。
答案 1 :(得分:2)
您可以将每个命令包装在具有相应“回滚”操作和测试的对象或哈希表中:
$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
}
}
}