原子地运行powershell命令

时间:2019-01-24 16:43:25

标签: powershell atomic

我有3个需要同步运行的powershell命令,因为我需要将输出从1号传递到2号,依此类推。但是,如果有任何失败,我需要退出所有3。是否甚至有cmdlet或技术可以在powershell中启用此行为?

2 个答案:

答案 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
    }
  }
}