Windows PowerShell: 出力に関するオプション
Windows PowerShell には、皆さんが思っているよりも、出力を生成する方法がたくさんあります。このコラムでは、最近わかった方法のいくつかを紹介します。
Don Jones
Windows PowerShell は、常に新しい機能の発見があるすばらしい製品の 1 つです。情報を画面に出力したり、別の形式で出力したりするなど、出力の生成は、Windows PowerShell が得意とすることです。
Windows PowerShell を起動して、「Gcm –verb Out」というコマンドを実行してみてください (Windows XP までのバージョンに対応している v2 をダウンロードしてご利用いただくことをお勧めします)。さまざまな形式の出力を作成するようにデザインされたコマンドレットの一覧が表示されます。
出力のしくみについて
Out- コマンドレットは,Windows PowerShell の他のコマンドレットと同様にオブジェクトを使用するようにデザインされています。つまり、次のようなコマンドを実行すると画面 (通称、ホスト ウィンドウ) に出力が表示されます。
Get-Process | Out-Host
Windows PowerShell では、パイプラインの末尾に Out-Default コマンドレットがハードコードされているので、このコマンドの Out-Host の部分は実際には不要です。このコマンドレットの機能は、単に Out-Host に情報を転送することです。ですから、次のコマンドの機能は
Get-Process
次のコマンドと同じだと言えます。
Get-Process | Out-Default
Out-Default コマンドレットでは、内部で Out-Host コマンドレットにオブジェクトを転送します。すべての Out- コマンドレットに共通している興味深いところは、これらのコマンドレットでは実際のオブジェクトを処理できないことです。Out- コマンドレットでは、シェルの書式設定サブシステムで生成された特殊な種類の書式設定オブジェクトしか処理できません。
Out- コマンドレットが通常のオブジェクトを受け取ると、コマンドレットでは、一連の内部規則と構成の既定値に基づいて、いずれかの Format- コマンドレットを呼び出します。Format- コマンドレットでは、出力を構成する方法を定義した書式設定オブジェクトを生成し、Out- コマンドレットでは、その定義に基づいた出力を指定のデバイスに転送します。ですから、次のコマンドの機能は
Get-Process
次のコマンドと非常に似ていると言えます。
Get-Process | Format-Table | Out-Host
ここで学ぶべきことは、Out- コマンドレットでは、Format- コマンドレットで生成されたものしか使用できないということです。大部分に関しては、Format- コマンドレットで生成されたものを処理できるのは Out- コマンドレットに限られます。そのため、コマンド ラインの最後に指定するのは Format- コマンドレットになります。ただし、その後に Out- コマンドレットが続く場合は除きます。
出力が最後
Out- コマンドレットは、それより前に実行したコマンドの最終結果を処理するものなので、Out- コマンドレット自体が出力を生成することはありません (ただし、1 つだけ例外があります)。Out- コマンドレットを使用する場合、このコマンドレットは、コマンド ラインの一番最後に指定します。Out- コマンドレットを実行すると、パイプラインには、別のコマンドレットで処理するものがなくなります。
組み込みの Out- コマンドレットに関する唯一の例外は、Out-String コマンドレットです。このコマンドレットの動作は、一般的な Out- コマンドレットと大きく異なります。このコマンドレットでは文字列オブジェクトをパイプラインに配置します。このコマンドレットと例外は、このコラムの対象トピックではありませんが、このようなものがあることを覚えておいてください。詳細については、「Help Out-String」というコマンドを実行してください。
ちょっと待ってください。「組み込みの Out- コマンドレット」と言う店について補足させてください。組み込みのもの以外に Out- コマンドレットがあるというのは紛れもない事実です。たとえば、PowerGadgets という名前のサードパーティ製のアドインがあります。このアドインを使用すると、Out-Chart や Out-Gauge など、お楽しみ要素満載のコマンドレットがシェルに追加されます。このアドインに含まれる Out- コマンドレットには、先ほどと同じ規則や動作が当てはまるとは限らないので、(用意されている場合は) 各コマンドレットのヘルプ ページを参照して、そのしくみと機能を確認してください。
出力のオプション
Windows PowerShell には、多数の出力オプションが組み込まれています。
- 何も指定しない場合 Out-Host が既定のコマンドレットになります。
- Out-Printer コマンドレットでは、プリンターに出力を送信します。出力は、使用した Format- コマンドレットで指定されている形式または書式設定サブシステムの既定値に基づいて書式設定されます。
- Out-File コマンドレットでは、ファイルに出力を送信します。これは、Dir > file.txt のようなコマンドを実行するのと同じです。ショートカット > と >> では、内部で Out-File コマンドレットを使用しています。Out-File コマンドレットには、出力ファイルの幅 (この設定は、シェルによって行われる書式設定の判断に影響します)、文字のエンコーディング、追加または上書きなど、多数のオプションが用意されています。
- Out-Grid コマンドレットは、Windows PowerShell v2 で導入された新しいコマンドレットで、適切に動作するためには Microsoft .NET Framework 3.5 が必要です。このコマンドレットでは、オブジェクトをグラフィカルな表形式で出力します。この表には、クリックして並べ替えられる列の見出しがあり、特定の結果を検出するための検索とフィルターのボックスが用意されています。
これらのコマンドレットのヘルプを確認すると、さまざまなことを学習できます。たとえば、Out-Host コマンドレットには、一度に 1 ページずつ表示するように指定する -paging パラメーターがあることは、ご存じですか。この機能は、Cmd.exe シェルの more コマンドと似ています。次のコマンドを試してみてください。
Get-Service | Out-Host –paging
Out-File コマンドレットの -width パラメーターは、幅の広い表を作成する場合に便利です。私は、かなり大きな表を生成して、結果のファイルをプロッターに出力して、壁に貼るデータを作成したことがあります。既定幅は 80 列ですが、これでは幅の広い表を作成することができません。シェルの既定の設定では、4 列以下の列で構成されているか、構成の既定値で表のカスタム レイアウトが指定されている場合にのみ、データを表として表示します。
Get-WmiObject Win32_Service | Format-Table * |
Out-File c:\services.txt –width 750
Out-Printer コマンドレットには - name パラメーターが用意されているので、使用するプリンターを指定できます。特に指定しない場合は、Windows で設定している既定のプリンターが使用されます。
Out-Grid コマンドレットでは、-title パラメーターを使用して、表示ウィンドウのタイトルを指定できます。これは、適切なタイトルを表示することで、ユーザーがデータを理解しやすくなるので、スクリプトで表を出力する場合に便利です。
出力が不要な場合
最後に Out-Null コマンドレットを紹介します。このコマンドレットは、表示する必要がない出力を消去するために使用します。たとえば、ほとんどの Windows Management Instrumentation メソッドでは、メソッドが正常に実行されたかどうかを表すオブジェクトが返されます。このような出力が不要な場合は、次のようにオブジェクトを Out-Null コマンドレットに渡します。
Invoke-WmiMethod –name reboot –class win32_operatingsystem |
Out-Null
さまざまな出力のオプションを試してみるのは楽しいだけでなく、Windows PowerShell を使用して実行できることを学習するのにも役立ちます。より簡単に作業を実行して、自分で行う作業を減らす方法を十分に理解することができます。
Don Jones は、Concentrated Technology の創設者で、ConcentratedTech.com (英語) で Windows PowerShell や他のテクノロジに関する質問に答えています。また、Nexus.Realtimepublishers.com (英語) の創設者でもあり、このサイトでは、彼の多くの著書が無料でオンライン ブックとして提供されています。