Windows PowerShell: トランザクションのサポート

Windows PowerShell では、トランザクション操作がサポートされるようになりましたが、その動作には優先順位があります。

Don Jones

数字にはパワーがあります。Windows PowerShell v2 の新機能の 1 つに、トランザクション操作のサポートがあります。一般的に、トランザクションとは複数の個別の操作のことを指し、これらの操作は 1 つのまとまりとして成功または失敗する必要があります。

いくつかのレジストリ キーを変更する一連のコマンドを記述するとします。アクセス許可の不足などの問題によって 1 つの変更が失敗する可能性がありますが、その場合は、その変更を保存する必要はありません。すべての変更処理が正常に完了した場合のみ、変更を反映する必要があります。Windows PowerShell のトランザクションでは、まさに、この動作を実現できます。

必要になるもの

トランザクション操作の実行には、Windows PowerShell v2 の他に、Windows Vista、Windows Server 2008、またはそれ以降のバージョンの Windows が必要になります。Windows PowerShell v2 は Windows XP や Windows Server 2003 などの古いオペレーティング システムでも実行できますが、これらのバージョンは、トランザクション操作のサポート対象外です。

これは、Windows PowerShell が進化するときの共通パターンとなります。新しいバージョンのシェルは古いバージョンの OS でも実行できますが、特定の機能を使用できるのは、新しいバージョンの Windows でシェルを実行している場合に限定されます。

シェルでは、PSDrive プロバイダーを通じてトランザクションをサポートします。PSDrive プロバイダーでは、レジストリやファイル システムのような、なんらかのストレージを適合して、標準的なディスク ファイル システムのように見えるようにしています。また、トランザクションを明示的にサポートする必要があります。Windows PowerShell v2 では、既定で、レジストリ プロバイダーのみがトランザクションをサポートします。

また、他のコマンドレットでトランザクションをサポートすることも可能で、そのようなトランザクションには –UseTransaction パラメーターを含めます。実際、シェルにはトランザクションを実行するためのフレームワークが用意されています。特定のコマンドレットや PSDrive プロバイダーでは、トランザクションを使用するのに必要な機能を実装する必要があります。

トランザクションを開始する

Start-Transaction コマンドレットを実行すると、トランザクションを開始できます。パラメーターを指定しない場合に、既に開始されているトランザクションがないと、新しいトランザクションが開始されます。このコマンドレットをトランザクションの実行中に実行すると、既存のトランザクションに参加するので、新しいトランザクションは開始されません。

Start-Transaction –independent というコマンドを実行する場合は、新しい単独のトランザクションが開始されてアクティブになります。一度に複数のトランザクションを開始できますが、一度にアクティブにできるのは 1 つだけです。そのため、トランザクション間で優先順位が発生することがあります。

  • トランザクション 1 (Start-Transaction)
  • トランザクション 2 (Start-Transaction –independent)
  • トランザクション 3 (Start-Transaction –independent)

トランザクション 3 がアクティブな場合は、トランザクション 3 で実行されているすべてのサポートされているコマンドが、そのトランザクションの一部となります。ロールバックまたはコミットすることで、トランザクション 3 が終了すると、トランザクション 2 が再度アクティブになります。一度にアクティブにできるのは 1 つのトランザクションのみですが、テストは行われません。つまり、トランザクション 3 の完了後、トランザクション 2 が中止されると、トランザクション 3 の一部として完了したすべての処理はコミットされたままになります。

Get-Transaction コマンドレットは、いつでも実行して、現在アクティブなトランザクションを確認できます。既定では、トランザクションで実行中のコマンドレットでエラーが発生すると、トランザクションは自動的にロールバックします (これについては後で詳しく説明します)。Start-Transaction コマンドレットでは、パラメーターを使用して、別のロールバックの優先順位を指定できます。

トランザクションを使用する

トランザクションを開始したら、–UseTransaction パラメーターを使用して、コマンドをトランザクションに明示的にアタッチする必要があります。コマンドレットでトランザクションがサポートされていても、トランザクションは自動的には使用されません。次のようにパラメーターを指定して、操作がトランザクションに含まれるようにする必要があります。

Cd hkcu:\software

Mkdir test

Start-transaction

Del test –usetransaction

Dir

ディレクトリの一覧には、test レジストリ キーが含まれています。このキーは削除されましたが、削除操作は、まだコミットされていないトランザクションの一部です。Dir –usetransaction というコマンドを実行すると、トランザクション内に存在しているディレクトリの一覧が表示されます。この際、test キーは一覧に表示されません。

トランザクションの終了とトランザクションに関するヒント

次の 2 つの方法のいずれかを使用してトランザクションを終了できます。

  • Undo-Transaction コマンドレットを使用すると、トランザクションに含まれていたすべてのコマンドをロールバックします。
  • Complete-Transaction コマンドレットを使用すると、トランザクションに含まれていたすべてのコマンドをコミットします。

Use-Transaction コマンドレットを使用すると、すべてのコマンドをトランザクションの一部として実行できます。ただし、含められるのは、トランザクションに対応した Microsoft .NET Framework オブジェクトを使用するコマンドだけです。単に従来のコマンドをトランザクションに追加して機能させることはできません。詳細については、Help about_transactions コマンドを実行してください。

現時点では、レジストリ内でトランザクション操作を実行する機能は、あまり便利とは思えないかもしれません。現時点では、ファイル システムのトランザクション操作の基盤となるサポートは既に存在していますが、ファイル システムの PSDrive プロバイダーでは、トランザクション操作が、まだサポートされていません。マイクロソフトでは、(Windows PowerShell のベースになっている) より多くの .NET Framework オブジェクトをトランザクション対応にしている傾向が見られます。将来は、Active Directory に対してもトランザクション操作を実行できるようになるかもしれません。

さいわい、シェルでは既にさまざまなトランザクションがサポートされています。つまり、ファイル システムでトランザクションがサポートされていれば (いつかサポートされることは間違いありません)、1 つのトランザクションにファイル操作とレジストリ操作の両方を混在させて、かなり便利なツールを作成できます。

 

Don Jones

Don Jones は、Concentrated Technology の創設者で、ConcentratedTech.com (英語) で Windows PowerShell や他のテクノロジに関する質問に答えています。また、Nexus.Realtimepublishers.com (英語) の創設者でもあり、この Web サイトでは、彼の多くの著書が無料でオンライン ブックとして提供されています。

関連コンテンツ