运行 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
}
}
}
我有 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
}
}
}