Windows PowerShell: スプラッティング

コマンドに渡す前にパラメーターをバンドルできれば時間を節約できます。最新バージョンの Windows PowerShell では、この処理が可能です。

Don Jones

専門知識が問われる場面で "スプラッティング" などのような表現を使う業界は IT 業界以外に存在するのでしょうか。フロントガラスの修理工場では使用するかもしれませんが、それ以外の場面で使用されることは、あまり考えられません。

Windows PowerShell では、パラメーターをバンドルしてコマンドに渡す方法のことを "スプラッティング" と言います。これは Windows PowerShell 2.0 の新機能です。バージョン 1.0 が必要条件となっている Exchange Server 2007 を使用しているなどの理由で、現在もバージョン 1.0 を使用されている場合、この機能は使用できません。

これまでの方法

通常は、コマンド ラインでコマンドにパラーメーターを渡すことでコマンドを実行します。次に例を示します。

Get-WmiObject –computername SERVER-R2 –class Win32_LogicalDisk –filter "DriveType=3" –credential "Administrator"

もちろん、Windows PowerShell 2.0 でも、このようにコマンドを実行することは可能です。また、このようにコマンドを長々と入力するのがお好きでない場合は、パラメーター名を切り詰められます。必要なのは、シェルが各パラメーターを識別するのに十分なところまでパラメーター名を指定するだけです。つまり、次のようにコマンドを実行することもできます。

Get-WmiObject –comp SERVER-R2 –cla Win32_LogicalDisk –filt "DriveType=3" –cred "Administrator"

もちろん、位置指定パラメーターもあります。Get-WmiObject コマンドレットのヘルプを参照すると、1 つ目の位置で -class パラメーターを使用できることがわかります。つまり、適切な位置に値を指定すれば、パラメーター名を入力する必要もありません。

Get-WmiObject Win32_LogicalDisk –comp SERVER-R2 –filt "DriveType=3" –cred "Administrator"

位置指定パラメーターとコマンドレット名の代わりに使用できるエイリアスを併用すると、次のように解読不能なコマンド ラインができあがります。

Gwmi Win32_LogicalDisk –comp SERVER-R2 –filt "DriveType=3" –cred "Administrator"

私の講義では、Windows PowerShell を使用するときには、好きなようにコマンドを入力してかまわないと受講生に伝えています。と言うのも、入力を省略することで時間を節約できるからです。Windows PowerShell は、そのためのツールです。ただし、スクリプトにはコマンドをコピーして貼り付けるように指導しています。コマンドレットとパラメーターの完全な名前を使用することには意味があります。完全な名前を指定すると、後々、スクリプトが読みやすくなるというメリットがあります。

SAPIEN PrimalScript や Quest PowerGUI (無償のプラグインを使用した場合) など、市販のスクリプト エディターでは、コマンドレットやパラメーターの省略形の名前を完全な名前に展開することもできます。このようなエディターを使用すると、少ない労力で名前を切り詰めることが可能になります。

新しい方法

スプラッティングは、コマンドにパラメーターを渡すまったく新しい方法です。まず、ハッシュ テーブルを作成します (このテーブルは、ディクショナリまたは連想配列と呼ばれることもあります)。ハッシュ テーブルは、一連のキーと値のペア (<キー>=<値>) で構成されています。基本的なハッシュ テーブルには、2 つのキーと各キーに対応する値が 2 つ含まれています。Windows PowerShell では、次のようになります。

@{'key1'='value1';'key2'='value2'}

@ 記号はハッシュ テーブルの開始を表し、ハッシュテーブルは中かっこ { } で囲まれます。また、各キーと値のペアは、セミコロンで区切られます。スプラッティングでは、キーがパラメーター名になり、値がパラメーターに渡す値になります。スクリプトでは、次のようにハッシュ テーブルの定義で改行を使用して、スクリプト ブロックを読みやすくすることもできます。

$parms = @{'class'='Win32_BIOS';
        'computername'='SERVER-R2';
           'filter'='drivetype=3';
   'credential'='Administrator'
          }

パラメーターをコマンドに渡すには、再度 @ 記号を使用します。ただし、この @ は、スプラッティング演算子となります。1 つの記号 (@) に 2 つの用途があると混乱するかもしれませんが、これは問題なく機能します。

Get-WmiObject @parms

ここで小さな秘策を使用しています。@ 記号の後には、ドル記号を含まない変数名を指定しています。この変数については少し説明する必要があるでしょう。と言うのも、これは Windows PowerShell で、多くのユーザーがつまずく大きなポイントだからです。

Windows PowerShell では、変数名は、文字、数字、アンダースコアを単に組み合わせたものに過ぎません。変数名にスペースや他の記号を含めることは可能ですが、そうすると見づらくなります。変数名の前にドル記号を付けることで、変数自体を処理する必要がないことを Windows PowerShell に伝えられます。処理が必要なのは、変数に格納されている値です。つまり、$var = 5 というコードでは、var という名前の変数に 5 という数値を格納しています。

@ 記号を、スプラッティング演算子として使用した場合も同じような処理が行われます。スプラッティング演算子を指定すると、スクリプトでは、後続の文字を取得し、それが変数名だと見なします。また、その変数にはハッシュ テーブルが含まれており、キーがパラメーター名であることを想定します。キーを展開し、ハッシュ テーブルの値をパラメーターに渡します。この説明は長くて退屈だと思われるかもしれませんが、これが実際に行われていることです。

特にスクリプトでは、次のコードの方が

$parms = @{'class'='Win32_BIOS';
        'computername'='SERVER-R2';
           'filter'='drivetype=3';
           'credential'='Administrator'
          }
Get-WmiObject @parms

次のコードよりもわかりやすいと感じる人がいます。

Get-WmiObject –computername SERVER-R2 –class Win32_LogicalDisk –filter "DriveType=3" –credential "Administrator"

好みの問題であることは間違いありませんが、スプラッティング技法についても、議論が交わされることは容易に想像できます。ですが、スプラッティングを使用すると、パラメーター (名前と値の両方) を、1 つの場所にまとめられ、整然と並ぶように見た目を整えられます (私の講義では「整然」が大きなテーマとなっています)。

次回スクリプトにコマンドを配置するときには、スプラッティング技法を使用することを検討してください。少なくとも、聞こえは良いと思います。

Don Jones

Don Jones は、Windows PowerShell MVP で、執筆活動や教育活動に従事しています。Don には、ConcentratedTech.com (英語) からアクセスできます。また、この Web サイトでは、彼が担当する講義やカンファレンスでの講演情報が公開されています。

補足記事: Windows PowerShell のビデオ

今月のコラムには補足資料としてビデオ (Magazine Extras - Concentrated Technology (マガジン補足記事、英語)) を提供しています。それ以外にも、YouTube - ConcentratedDon さんのチャンネル (英語) で Windows PowerShell のビデオを無料で公開しています。

Don Jones が TechMentor Spring 2011 で担当する 3 日間の実践的なワークショップへの登録締め切りまで、あとわずかです。詳細については、TechMentorEvents.com (英語) を参照してください。

関連コンテンツ