Windows PowerShell各コマンドレットについて掘り下げる

Don Jones

Windows PowerShell には、多くの管理者によって見過ごされている機能が多数あります。詳しく調査することで、驚くようなすばらしい機能を発見することができます。実際、私自身も、既に十分理解していると思っていたコマンドレットに関連した新しい機能に出会うことがあります。

私が講師を務めている Windows PowerShellTM のクラスでは、市販の「今日の格言」カレンダーにちなんで「今日のコマンドレット」というカレンダーを作成することを管理者の方々に勧めています。このようにすると、平日は毎朝 (週末はお休みです)、特定のコマンドレットの機能について学習する時間を持つことができます。Windows PowerShell には 130 個のコマンドレットが用意されています。つまり、このスケジュールに従えば、約半年で Windows PowerShell 博士になれるということです。Windows PowerShell コマンドレットについて詳しくなったら、次は Exchange Server 2007 コマンドレットについて学習することができます。

今月のコラムでは、数分の時間を費やして、さまざまなコマンドレットの詳しい機能を調査するだけで、コマンドレットについてどのようなことを発見して、何を行えるようになるのかをご紹介します。

洗練された HTML 形式のレポート

あまり知られていないコマンドレットの 1 つに ConvertTo-HTML があります。この優れたコマンドレットでは、入力オブジェクトのコレクションを受け取り、HTML 形式のテーブルに変換します。対応しているオブジェクトは、サービス、プロセス、Windows® Management Instrumentation (WMI) オブジェクトなど、基本的にすべてのオブジェクトです。この HTML を Out-File コマンドレットにパイプすると、イントラネット Web サーバーに公開できる HTML ページを入手することができます。たとえば、次のコード行を毎朝実行するようにスケジュールしたとしましょう。

Gwmi Win32_Service | Where { $_.StartMode –eq "Auto" –and $_.State –ne "Running" } | ConvertTo-HTML | Out-File C:\ServiceAlert.html

このコードにより、自動的に実行される必要があるサービスのうち実行されていないものをリストする、図 1 に示すような HTML 形式のレポートが作成されます。

図 1 実行されていないサービスに関する HTML 形式のレポート

図 1** 実行されていないサービスに関する HTML 形式のレポート **(画像を拡大するには、ここをクリックします)

もちろん、より洗練されたレポートを作成することも可能です。さいわい、ConvertTo-HTML コマンドレットでは、クリーンな HTML ファイルが生成されます。つまり、作成された HTML コードには書式を設定するタグは含まれていません。HTML の規則に従い、HTML ページには、書式設定は設定しないのが得策です (少なくとも書式設定は最低限に抑えるべきです)。書式設定が必要な場合は、外部のカスケード スタイル シート (CSS) で設定し、その CSS を HTML ファイルにリンクすることをお勧めします。このリンクも ConvertTo-HTML コマンドレットを使用して作成できます。

CSS は、HTML ファイルの <HEAD> セクションにリンクされます。ConvertTo-HTML コマンドレットのヘルプを参照すると、このコマンドレットの構文には、皆さんが見過ごしている可能性のあるパラメータがあることを確認できます。

ConvertTo-Html [[-property] <Object[]>] [-inputObject <psobject>] [-body <string[]>] [-head <string[]>] [-title <string>] [<CommonParameters>]

–head パラメータを使用すると、スクリプトの <HEAD> セクションに追加の HTML コードを指定できます。次のコマンドを実行すると、簡単にワンンライナーを変更して、HTML ファイルのテーブルに適用する書式設定を含む既存の CSS ファイルにリンクすることができます。

Gwmi Win32_Service | Where { $_.StartMode –eq "Auto" –and $_.State –ne "Running" } | ConvertTo-HTML -title "Services" -head "<link rel='stylesheet' href='styles.css' type='text/ css' />" | Out-File C:\ServiceAlert.html

ここでは、–head パラメータを使用して、HTML 出力ファイルと同じフォルダにある CSS ファイルへのリンクを挿入しました。また、–title パラメータを使用して、Web ページのタイトルを設定しました。このコマンドを実行すると、結果の HTML ファイルは図 2 のようになります。Style.CSS ファイルでは、次のような情報が指定されています。

図 2 CSS ファイルで書式設定された HTML 形式のレポート

図 2** CSS ファイルで書式設定された HTML 形式のレポート **(画像を拡大するには、ここをクリックします)

body { background-color:#EEEEEE; } body,table,td,th { font-family:Tahoma; color:Black; Font-Size:10pt } th { font-weight:bold; background-color:#CCCCCC; } td { background-color:white; }

簡単なフィルタ処理

今月のコマンドレット

今月は、Start-Transcript と Stop-Transcript というコマンドレットのペアをご紹介します。どちらも Windows PowerShell トランスクリプトのログ記録に関連するもので、コンソール ウィンドウに表示される情報を指定のテキストに書き込むためのコマンドレットです。これは、とても単純です。処理を開始するのに必要な作業は、Start-Transcript コマンドレットを実行し、ファイル名を指定するだけです。そして、ログ記録を終了して、ファイルを閉じるのに必要な作業は、Stop-Transcript コマンドレットを実行するだけです。このコマンドレットは、アドホックなシェルの使用から正規のスクリプトまで、幅広い用途に使用できます。シェルでコマンドラインを実行したら、作成したトランスクリプト ファイルから結果をコピーして、貼り付けることができます。もちろん、トランスクリプトを編集して、その中身を実行されたスクリプトだけにすることも可能です。同僚の MVP 受賞者である Jeffery Hicks は、トランスクリプトを解析して、Windows PowerShell PS1 ファイルに変換するスクリプトを作成しました。このスクリプトは、blog.sapien.com/current/2006/11/28/powershell-transcripts.html で公開されています。

次は、Get-WMIObject コマンドレットを見てみましょう。Windows PowerShell の組み込みのヘルプに記載されている、このコマンドレットの構文は、あまり知られていない機能を示唆しています。

Get-WmiObject [-class] <string> [[-property] <string[]>] [-namespace <string>] [-computerName <string[]>] [-filter <string>] [-credential <PSCredential>] [<CommonParameters>]

Windows PowerShell を使い慣れていないユーザーには、WIM コマンドを次のように発行するというミスがよく見られます。

Gwmi Win32_NTLogEvent –comp Server2

このコマンドは、Server2 のイベント ログからすべてのイベント ログ エントリを取得します。この作業は、Server2 で処理をしてデータを転送するのにしばらく時間がかかります。また、Windows PowerShell では、非常に大きなコレクションに対して何か処理を行う際には時間がかかります。

より適切なアプローチは、必要なデータを Server2 が検索して送信するようにすることです。もちろん、この処理は、WIM Query Language (WQL) クエリを使用して行うことも可能です。このクエリの構文が難しいと感じる方もいらっしゃいますが、Windows PowerShell では、次のように –filter パラメータを使用して、WQL クエリのフィルタ処理の部分を指定することができます。

Gwmi Win32_NTLogEvent –comp Server2 –filter "EventIdentifier=1024"

このコマンドは、任意のログから、イベント ID が 1024 のすべてのイベントを取得します。フィルタの条件では、比較演算子として Windows PowerShell の –eq 演算子ではなく、= を使用していることに注意してください。フィルタの条件は、単に処理されるためにリモート コンピュータの WMI サービスに渡されているので、条件は Windows PowerShell の構文ではなく WMI 構文で指定する必要があります。

Get-ChildItem コマンドレット、Dir や Ls というエイリアスのコマンドレットなど、他のコマンドレットには –filter パラメータがあります。ほとんどの場合、-filter パラメータは、フィルタ条件を、基礎となるテクノロジに直接渡しています (私は、これを "ソース フィルタリング" と呼んでいます)。この処理は、すべてのオブジェクトを取得してから、Where-Object コマンドレットを使用してすべてのオブジェクトを確認して、不要なオブジェクトを除外するよりも、早いことが多いです。

見過ごされがちなコマンドレット

「今日のコマンドレット」というコマンドレットについて学習するアプローチは、既に知っていると思っていたコマンドレットについての理解を深めるのに効果的であるのは言うまでもありません。しかし、「今日のコマンドレット」カレンダーを推奨する別の理由は、このアプローチを使用しなければ知り得なかったコマンドレットについて学習できるからです。多くのユーザーに知られていないコマンドレットで、私が気に入っているコマンドレットに Resolve-Path というコマンドレットがあります。このコマンドレットにワイルドカードを使用したパスを指定すると、そのパスに一致する一連のファイル名とフォルダ名を返します。これは、Get-ChildItem コマンドレット (つまり、おなじみの Dir エイリアスや Ls エイリアス) と似ていますが、このコマンドレットでは、ファイル オブジェクトやフォルダ オブジェクト全体を返すのではなく、他のコマンドレットにパイプして、さらにフィルタ処理や処理を行える単純な文字列としてファイル名やフォルダ名を返します。使い方は次に示すように簡単です。

Resolve-Path C:\P*

この単純なコード行を実行すると、C:\Program Files や C:\Processes.txt のようなパスが返されます。図 3 に、このコマンドレットの使用例を 2 つ示します。

図 3 見過ごされがちな便利な Resolve-Path コマンドレットの使用例

図 3** 見過ごされがちな便利な Resolve-Path コマンドレットの使用例 **(画像を拡大するには、ここをクリックします)

まずはオーソドックスなものから

「今日のコマンドレット」に取り掛かる準備ができたら、Get-Command のエイリアスである Gcm を実行してください。このコマンドレットを実行すると、Exchange Server 2007 管理シェルや PoweShell Community Extensions などのスナップインから追加したものを含め、PowerShell で認識されているすべてのコマンドレットの一覧が返されます。この一覧の先頭にあるコマンドレットを選択して、そのヘルプを確認してください (ちなみに、私の環境では、一覧の先頭にあるのは Add-Content コマンドレットで、このコマンドレットのヘルプを表示するには、次のコマンドを実行します)。

Help Add-Content –full

簡単な既定のヘルプではなく、詳細なヘルプが必要でしょう。詳細なヘルプでは、各パラメータの詳細な説明や、コマンドレットの使用例、他の情報を入手できます。少し時間を取って「今日のコマンドレット」を試してみてください (実稼働環境に影響を与えないよう、バーチャル マシンを使用することをお勧めします)。また、この作業が習慣になるように、毎日同じ時間に 10 分ほど時間を取ることをお勧めします。これが習慣になれば、あっという間に、Windows PowerShell が提供するすべての機能についての理解を深めることができるでしょう。

Don Jones は SAPIEN Technologies のリード スクリプト グルであり、『Windows PowerShell: TFM』(SAPIEN Press、2007年) の共著者でもあります。連絡先については、www.ScriptingAnswers.com にアクセスしてください。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.