代码之家  ›  专栏  ›  技术社区  ›  NealR

以原子方式运行powershell命令

  •  1
  • NealR  · 技术社区  · 6 年前

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Mike Shepard    6 年前

    通常,PowerShell命令不支持“退出”或“回滚”。注册表提供程序确实支持事务(允许这种行为),但仅支持涉及注册表的操作。

    您可以在命令中捕获正在更新的事物的状态并重新应用这些状态,但这将是一个非常手动的过程。

        2
  •  2
  •   Mathias R. Jessen    6 年前

    您可以使用相应的“回滚”操作和测试将每个命令包装在对象或哈希表中:

    $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
        }
      }
    }