运行 powershell 原子命令

Run powershell commands atomically

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

一般情况下,PowerShell 命令不支持 "backing out" 或 "rollback"。注册表提供程序确实支持事务(这将允许这种行为),但仅限于涉及注册表的操作。

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

您可以将每个命令包装在一个对象或哈希表中,并带有相应的 "rollback" 操作和测试:

$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> 跟踪在 "roll-back"

事件中需要执行的操作
$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
    }
  }
}