Windows PowerShell: 新しいシェルの新しい構文

多少の制限はありますが、Windows PowerShell 3.0 のいくつかの新しい構文コマンドを使用すると、読みやすいコマンドを記述できるようになります。

Don Jones

Windows PowerShell 3.0 の新機能の 1 つに、Where-Object コマンドレットと ForEach-Object コマンドレットの新しい構文があります。通常、これらのコマンドレットでは、スクリプト ブロックを受け取ります (Where-Object コマンドレットの場合は、$True または $False を返す必要があるので、フィルター スクリプトと呼ばれるものを受け取ります)。

このスクリプトブロックでは、$_ というプレースホルダー記号を使用して、コマンドレットにパイプされたものを表すことができます。次に、この 2 つのコマンドレットの使用例を示します (これは実用的なコマンドではありませんが、コマンドレットの使用法を明確に示しています)。

Get-WmiObject –class Win32_LogicalDisk | Where-Object –filterscript{ $_.DriveType –eq 3 } | ForEach-Object –process { $_.ChkDsk() }

これらのコマンドが、このように記述されるのを目にすることはないでしょう。多くのユーザーは、入力する文字数を減らすために、エイリアスを使用したり、パラメーター名の一部のみを入力したり、位置指定パラメーターを使用したりしするので、一般的には、次のようなコマンドが見られます。

gwmi Win32_LogicalDisk | ? { $_.DriveType –eq 3 } | % { $_.ChkDsk() }

職務上のセキュリティを確保するには、少し読みづらい構文を使用するに限りますね。Where-Object コマンドレットの新しい構文を使用すると、次のような処理を行えるようになります。

gwmi Win32_LogicalDisk | where DriveType –eq 3 | % { $_.ChkDsk() }

ここでは、コマンドレットのエイリアスを別のものに切り替えていることに注意してください。お望みであれば、? を使用することは可能ですが、? を使用すると、私はイライラします。と言うのも、私が長いこと使用していた BASIC では、? は Print ステートメントのショートカットとして使用されていました。Windows PowerShell のコマンドで ? を見ると頭が痛くなります。中かっこと $_ 記号を使用するのも止めました。

基本的に、Where-Object コマンドレットでは、フィルター処理に使用するプロパティ (ここでは、DriveType) を受け取る位置指定パラメーターに対応するようになりました。このコマンドレットでは、すべての Windows PowerShell の主な演算子 (-eq、-ne、-like、-gt など) がパラメーターとして定義されており、このパラメーターの値は、フィルター処理に使用する値 (ここでは、3) になります。この短縮形は読みやすいですが、1 つの比較にしか使用できません。たとえば、次のステートメントは無効です。

Gwmi Win32_Service | Where StartMode –eq 'Auto' –and State –ne 'Running'

そのため、次のような以前の構文を使用する必要があります。

Gwmi Win32_Service | Where { $_.StartMode –eq 'Auto' –and $_.State –ne 'Running' }

ForEach-Object コマンドレットでも、同様に使用する記号の数が少ない構文が用意されています。

gwmi Win32_LogicalDisk | where DriveType –eq 3 | foreachChkDsk()

ここでも、読みやすさを考慮して、% の代わりに ForEach エイリアスを使用しましたが、お望みであれば、引き続き % を使用することは可能です。私の仲間の MVP が、これらの構文の短縮形に関するブログ記事 (英語) を公開しています。一読の価値があるので、ぜひご覧ください。このブログ記事では、誤解されることが多い $_ 記号の代わりに使用できると思われる $PSItem について紹介しています。

個人的には、これらの新しい構文に対して複雑な思いがあります。まず、初心者にとっては、間違いなく理解しやすいものだと思います。中かっこと混乱を招きがちな $_ を使用する必要がないのは、すばらしいことです。ただし、これらの新しい構文は、完全に機能するわけではありません。これらの構文では 1 つのものしか比較できず、依然として、以前の構文を習得する必要があります。

また、以前の構文は、6 年にわたって、ブログ、雑誌記事、および書籍で紹介されています。このような媒体で紹介されている例を理解するには、以前の構文を把握している必要があります。

ですから、この新しい構文の登場によって、古い構文を把握する必要がなくなるわけではありません。1 種類ではなく 2 種類の構文を覚える必要があることになります。そうは言っても、これが現実で、私たちは、この方法を受け入れる必要があります。

Don Jones

Don Jones は、Microsoft MVP の受賞者で、『Learn Windows PowerShell in a Month of Lunches』(Manning Publications、2011 年) の著者でもあります。この書籍は、管理者が Windows PowerShell を効率的に使用できるようにすることを目的としています。また、一般ユーザーを対象にオンサイトの Windows PowerShell トレーニングも開催しています。Don に対するお問い合わせについては、ConcentratedTech.com (英語) または bit.ly/AskDon (英語) を参照してください。

関連コンテンツ