背景
powershellスクリプト(ps1)でアイテム削除するスクリプトを書いていて、ふと、削除処理をトランザクション制御できたら便利じゃない?と思ったので。
結論から言うと出来ませんでした。
Start-Transaction
Start-Transactionコマンドレットでトランザクションを開始できます。コミットするにはComplete-Transactionです。
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-transaction?view=powershell-5.1
このStartとComtleteで挟まれたブロックは、トランザクション制御の対象になります。ただしそのブロック内で使用するコマンドレットがトランザクションに対応してないといけません。
具体的には-UseTransactionパラメータが指定できるかどうかです。
加えて、プロバイダがトランザクションに対応してる必要があります。
プロバイダ?
PowerShellにおけるオブジェクト操作の仕組みです。
https://docs.microsoft.com/ja-jp/powershell/scripting/developer/provider/windows-powershell-provider-overview?view=powershell-7
Windows PowerShell プロバイダーを使用すると、マウントされたドライブのように、任意のデータストアをファイルシステムとして公開できます。
トランザクション制御に対応しているプロバイダはレジストリのみです。
つまり、レジストリに関する操作はトランザクション制御が可能です。
対応しているプロバイダは下記のコマンドレットで調べましょう。
get-psprovider | where {$_.Capabilities -like "*transactions*"}
トランザクションで怒られてみる
remove-itemでtransactionを指定してみましょう。
怒られました。ファイルシステムがトランザクション非対応です。
まとめ
残念ながらファイルシステムプロバイダがトランザクション制御していませんでした。
いつか対応するんでしょうか?