Выполнять команды powershell атомарно - PullRequest
0 голосов
/ 24 января 2019

У меня есть 3 команды powershell, которые должны выполняться синхронно, так как мне нужно передать выходные данные с 1-го на 2-й и так далее. Однако, если что-то не получается, мне нужно отказаться от всех 3. Есть ли даже командлет или техника, которая включит такое поведение в powershell?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы можете заключить каждую из ваших команд в объект или хеш-таблицу с соответствующим действием «отката» и тестом:

$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
    }
  }
}
0 голосов
/ 24 января 2019

Как правило, команды PowerShell не поддерживают «возврат» или «откат».Поставщик реестра поддерживает транзакции (которые допускают такого рода поведение), но только с операциями, связанными с реестром.

Может быть возможно зафиксировать состояние вещей, которые вы обновляете, в командах и повторно-применить эти состояния, но это будет очень ручной процесс.

...