Windows PowerShell: Windows PowerShell ワークフローについて

Windows PowerShell ワークフローを使用するとプロセスが複雑になる可能性がありますが、Windows PowerShell の機能には、それだけの価値があります。

注: 2013 年は、Don Jones が Windows PowerShell ワークフローに関する 12 部構成のチュートリアルを毎月 1 部ずつお届けします。2013 年 1 月号から始まるシリーズは順番にお読みいただくことをお勧めします。

Don Jones

Windows PowerShell ワークフローは、Windows Management Framework 3.0 の新しい機能です。広い意味では、ワークフローは Windows PowerShell の特殊な種類のスクリプトと言えます。ワークフローでは、一連のタスクの大枠を定義します。タスクには、特定のシーケンスで実行する必要があるものもあれば、並列実行できるものもあります。

Windows PowerShell ワークフローは、Windows Server 2012 と Windows 8 に、あらかじめインストールされていますが、Windows 7、Windows Server 2008、および Windows Server 2008 R2 でも使用することができます。ワークフローを実行するには、これらの OS のいずれかが必要になります。ただし、実行するタスクにもよりますが、ワークフローはあらゆるバージョンの Windows を対象とする (あらゆるバージョンの Windows に対してタスクを実行する) ことができます。

Windows PowerShell ワークフローは、多かれ少なかれ標準の Windows PowerShell の構文を使用して記述されています。ただし、ワークフローと従来の Windows PowerShell のスクリプトには、互換性の問題がいくつかあり、Windows PowerShell ワークフローでは Windows PowerShell リモート機能を多用しています (リモート処理の入門書や構成アドバイスが必要な場合は、無料の『Secrets of PowerShell Remoting』(PowerShell.org、2012 年) を参照してください)。

ワークフローのしくみ

(このシリーズを通じて後ほど詳しく説明しますが) 詳しく調べてみると、Windows PowerShell ワークフローは Windows PowerShell によって実行されていないことがわかります。その代わり、Windows PowerShell によってスクリプトが XAML に変換され、Microsoft .NET Framework の構成要素である Windows Workflow Foundation (WWF) に渡されます。WWF が XAML を受けとって、実際に処理を実行します。

ワークフローが Windows PowerShell ではなく WWF で実行されるという事実は、いくつかの興味深い機能や多くの複雑なプロセスをもたらします。たとえば、WWF は、ワークフローの進行状況を確認するように設計されています。この仕様により、ワークフローを実行しているコンピューターが、シャットダウンなど、なんらかの形で中断された場合でも、ワークフローは、コンピューターが再起動したときに中断された地点から再開できます。

手動でワークフローを中断したり再開することもできます。たとえば、ワークフローでは、手動操作が必要なところまでタスクを完了できます。操作を中断して、進捗の更新を記載した電子メール メッセージを自動的に送信することもできます。手動のタスクが完了したら、ワークフローを再開して処理の実行を続けることができます。

必要であれば、ワークフローでは、並列して処理を実行することもできます。たとえば、相互依存関係がなく、どのような順番でも実行できる複数のタスクがある場合、すべてのタスクは同時に実行できます。このようにするとワークフローの完了にかかる総時間が短縮され、効率が上がります。また、WWF ではワークフローの各ステップも記録します。つまり、タスクの完了状況に関する詳細な監査ログを生成することができます。これはトラブルシューティングを行うときにかなり役立ちます。

ワークフローでは、Windows PowerShell スクリプトで実行できるすべてのことを実行できるわけではありません。このシリーズを通じて学んでいただきますが、ワークフローでは WWF が認識できるものに変換できない処理は実行できません。実際、Windows PowerShell には、このような変換ができないいくつかの側面があります。このため、ワークフローは、Windows PowerShell のサブセットでも、スーパーセットでもなく、ワークフローは、Windows PowerShell のクロスセットです。つまり、ワークフローは Windows PowerShell にいくつかの機能を追加できますが、使用できない機能もいくつかあります。これはワークフローが複雑である側面の 1 つです。

ワークフローが唯一の解決策ではない

ワークフローが、すべてのタスクに対する最善の解決策というわけではありません。マイクロソフトの製品チームや多数のワークフロー愛好家によるワークフローに対する盛り上がりから、すべてのものをワークフローとして実行する必要があるという印象を受けているかもしれません。ワークフローの習得には確実に時間がかかるため、このような勧めに従う必要はありません。また、トラブルシューティングやデバッグも困難なので、ワークフローを常に使用する必要があるとは限りません。

たとえば、単純に複数台のコンピューターにタスクを並列実行する必要がある場合、この処理は従来のリモート処理を使用して実行できます。また、Windows PowerShell 2.0 形式のバックグラウンド ジョブを使用することもできます (この機能は Windows PowerShell 3.0 でも引き続き使用できます)。

単純に対象のコンピューターを再起動する一連のタスクを実行して、コンピューターが再起動するまでスクリプトの続行を待機する必要がある場合は、新しいバージョンである 3.0 の Restart-Computer コマンドレットを使用して実行できます (このコマンドレットには Wait スイッチの機能が用意されています)。ワークフローには強力で独特の機能が備わっていることがおわかりいただけたと思いますが、必ずしもすべてのタスクを最も簡単に実行できる方法であるとは限りません。

ワークフローの構造

ワークフローは、機能やコマンドレットと同様に、Windows PowerShell コマンドの一種です。一度作成したら、基本的には他のコマンドのように簡単に実行できます。また、スケジュールを設定したり、リモート コンピューターにプッシュして実行することもできます。実行時には、Windows PowerShell が、ワークフローを WWF に変換し、WWF にワークフローを実行するように要求します。

他の種類のコマンドと同様に、ワークフローには、実行時に動作をカスタマイズするパラメーターを渡すことができます。また、特定の動作を自動で有効にするさまざまな共通パラメーターもあります。

ワークフロー内では複数のアクティビティを定義できます。これらのアクティビティは、特定のシーケンスで実行したり、並列実行するように設定できます。シーケンスを指定したブロックや並列処理のブロックは好きなように組み合わせて使用できます。鍵となるのは、アクティビティを WWF が認識できるものにする必要があることです。ここが難解なところです。

Windows PowerShell チームは、Windows PowerShell の大部分の主要コマンドレットに対応する WWF "バージョン" のコマンドレットを提供しています。つまり、これらのコマンドレットは、ワークフローで直接使用できます。これらのコマンドレットは WWF に変換されると、WWF に対応したコマンドレットに置き換えられ、期待したとおりに実行されます。

すべての Windows PowerShell コマンドレットについて WWF に対応したバージョンが用意されているのが理想的な状態です。このような状況が実現されれば、ワークフローは、長年記述していて、なじみのある Windows PowerShell スクリプトと見た目が近くなるでしょう。しかし、理想と現実は異なります。実際、大部分のコマンドレットには WWF に対応したバージョンのコマンドレットは用意されていません。これは特に Exchange Server、SharePoint、および Windows Server 2012 に付属しているコマンドレットに当てはまります (ただし、Windows PowerShell の主要なコマンドレットは除きます)。

WWF では、これらのコマンドレットをそのまま実行することはできません。このようなコマンドレットは、WWF で認識できるもの (InlineScript) でラップする必要があります。この特別なアクティビティでは、基本的に Windows PowerShell を実行するように要求して、InlineScript アクティビティの内容をシェルに提供します。

InlineScript は、独立したスタンドアロンの分離されたエンティティです。InlineScript 間では、すべての InlineScript がアクセスできる場所 (データベースなど) にデータを保持している場合を除き、情報を共有することができません。

このような仕様によって、ワークフローの作成は、より複雑になっています。しかし、多くの Windows PowerShell コマンドレットには WWF に対応したバージョンがないため、当面は InlineScript が主要な実行単位になります。

このシリーズの今後の予定について

ワークフローが優れた機能であることは間違いありません。適切なタスクに使用すると、ワークフローは驚くほどすばらしい機能を提供します。ただし、ワークフローは複雑です。ワークフローの使い方については、ある程度時間をかけて学習することをお勧めします。2013 年は、毎月、なるべく多くの情報をお届けすることを目標としています。

  • 2013 年 2 月: 前提条件とリモート処理の構成を含むワークフロー環境について説明する
  • 2013 年 3 月: 後続のコラムでの説明やコードの作成に取り組めるように基本的なワークフローの例を紹介する
  • 2013 年 4 月: スクリプトとワークフローを比較し、それぞれで機能すること/機能しないことの包括的な一覧を提供する
  • 2013 年 5 月: ワークフローのアクティビティ (重要な InlineScript アクティビティを含む) の詳細を説明する
  • 2013 年 6 月: ワークフローの一般的なパラメーターとランタイム変数について確認し、これらをワークフローで使用する方法を確認する
  • 2013 年 7 月: 独自のパラメーターをワークフローに追加する方法を説明する
  • 2013 年 8 月: ワークフロー内でシーケンスが指定されたアクティビティと並列アクティビティを構築し、これらを組み合わせる方法を説明する
  • 2013 年 9 月: ワークフローの進捗状況を確認する方法を説明し、手動およびプログラムを使用してワークフローを中断および再開する方法を確認する
  • 2013 年 10 月: これまでに学習したことに基づいて、新しい本格的なワークフローを作成する
  • 2013 年 11 月: 並列タスクなど、特定のタスクで使用できるワークフローに代わるものを説明し、大局的に説明する
  • 2013 年 12 月: ワークフローの機能セットを使用および操作する他の方法を確認する

1 年にわたる Windows PowerShell ワークフローについての連載を楽しみにしています。Windows PowerShell ワークフローに関するすべてのステップに参加していただければさいわいです。

Don Jones

Don Jones は、Windows PowerShell MVP の受賞者で、TechNet マガジンの寄稿編集者でもあります。彼は、Windows PowerShell と Windows PowerShell リモート処理を使用して HTML 形式のレポートを作成する方法について説明した無料の書籍を含む、Windows PowerShell 3.0 ついて 4 冊の書籍を共同執筆しています。すべての書籍は PowerShellBooks.com (英語) で確認できます。また、PowerShell.org (英語) のディスカッション フォーラムでは、彼に質問することができます。

関連コンテンツ