
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。Windows PowerShell と Get-Unique コマンドレットを使用して、コレクション内で一意の項目を特定できることは知っていますが、私はその反対の作業を行う必要があります。つまり、コレクション内で一意ではない項目を特定する必要があります。どうすればいいでしょうか。
-- YE

YE さん、こんにちは。このコラムを執筆している Scripting Guy は、昨日の午後、ちょうど帰宅の準備をしていたときに、Don Jones さんと Sapien Technologies 社の連名で送られてきた荷物を受け取りました。荷物が送られてきたことは、それほど意外ではありませんでした。というのも、Sapien 社は、2008 年冬季スクリプト競技大会で受賞者に差し上げるとてもすてきな賞品を寄贈することに応じてくれたからです。でも、このコラムを執筆している Scripting Guy は、次に示す梱包されている品物の一覧に、ある意外な品物が含まれていることに偶然気が付きました。
T シャツ、ポロシャツ、ミニサイズのメモ帳、付箋紙、ペン、"猿"、小さな書類ばさみ |
すてきな賞品とはまさにこのことです。Don Jones さんは、スクリプト競技大会で賞品として提供する猿を送ってくれました。
もちろん、興奮が少し冷めたら、少し心配になりました。何しろ、荷物はそれほど大きくなく、Don さんは空気穴を 1 つも開けていなかったのですから。猿は輸送中に死んでしまったかもしれないと不安になる一方で、死んでいないかもしれないとも思い、さらに不安になりました。もしそうだったとしたら、かわいそうな猿たちは、空気穴のない小さな箱に入れられて、おそらく食料や水も与えられずに国外に輸送されるという過酷な状況を生き延びたことになります (ただし、ペンと付箋紙が入っていたので、少なくとも輸送中の心境をつづることはできたでしょう)。
心境と言えば、Scripting Guys は生物学者ではありませんが、猿たちは空気穴のない小さな箱に閉じ込められて何日も過ごすことは好まないだろう、と思っています。ということは、私たちが受け取った荷物の中は猿でいっぱいではなく、"怒った" 猿でいっぱいになっている可能性が高いということです。箱を開けて確認することがとても楽しみな Scripting Guys はだれもいませんでした。
もちろん、何と言いますか、運が良ければ、怒った猿も受け取らずに、猿の死骸でいっぱいの荷物を受け取るはずです。Don さん、本当にありがとうございます。
でも結局、好奇心が勝り、箱を開けました。何が入っていたのか、ですって。実は、猿は入っていなかったのです。少なくとも本物の猿は入っていませんでした (いえ、少なくとも本物の猿ではないと "思っています"。先ほど言いましたが、私たちは生物学者ではありませんから)。代わりに、本物の猿よりもずっと良い Flingshot Flying Monkey が入っていました。
正直なところ、Flingshot Flying Monkey については、聞いたことがありませんでした (先ほどからお伝えしているように、私たちは生物学者ではありませんから)。しかし、Flingshot Flying Monkey はとてもすてきな商品です。ゴム パチンコとしても使えるし、ぬいぐるみとしても使えるし、叫び声をあげるバンシーとしても使えます。つまり、人生で最高の 3 つのものが 1 体に集約されています。
Don さん、本当にありがとうございます。
注 : Flingshot Flying Monkey の詳細については、As Seen On TV の Web サイトを参照してください。ただし、正気を失いたくない方は、コンピュータのスピーカーをミュートにしてから Web サイトにアクセスしてください。 |
おそらく皆さんは「空飛ぶ猿は、Sapien Technologies 社とどんな関係があるんだろう」と考えているでしょう。正直なところ、よくわかりません。しかし、Sapien 社はきっと私たちと同じことに気付いたはずです。何しろ、どの Flingshot Flying Monkey も次のようなスローガンがプリントされているマントを着ているのですから。
PrimalScript
WAY Better than Apes! (猿よりずっとすばらしい!)
Sapien 社は、PrimalScript の大ファンである空飛ぶ猿の集団をどうやって見つけたのか、ですって。わかりませんね。ご存じのように、私たちは生物学者ではありません。おそらく、運が良かっただけだと思います。あるいは、(空飛ぶ猿だけでなく) すべての猿が PrimalScript のファンなのかもしれません。それについては、また改めてお話します。
さて、空飛ぶ猿のことは忘れて、本題に戻りましょう。YE さんの手元に一連の項目があります。これが次のようなさまざまな種類のパイの一覧だとしましょう。
Apple Peach Chocolate Chocolate Apple Banana Cream Apple Blackberry Pecan Lemon Meringue French Silk Apple Pecan Raspberry Strawberry Key Lime Apple Pecan
YE さんは、一意ではない項目 (つまり、複数回出現する項目) を知りたがっています。Windows PowerShell を使用して、一意ではない項目を特定するにはどうしたらよいのか、ですって。1 つの方法としては、100 万頭の空飛ぶ猿を 100 万個の PrimalScript のコピーの前に座らせ、そのうちの 1 頭が解決策を思い付くのを期待して待つ方法があります。もう 1 つは、次の単純で短いスクリプトを実行する方法です。
$arrPies = "Apple", "Peach", "Chocolate", "Chocolate", "Apple", "Banana Cream",`
"Apple", "Blackberry", "Pecan", "Lemon Meringue", "French Silk", "Apple", `
"Pecan", "Raspberry", "Strawberry", "Key Lime", "Apple", "Pecan"
$arrPies | Group-Object | Where-Object {$_.Count -gt 1}
先ほど言ったように、このスクリプトはそれほど複雑ではありません。1 行目では、$arrPies という名前の配列にパイの一覧を追加しているだけです。2 行目では、このパイの配列を取得して、Group-Object コマンドレットにパイプ処理しています。その後、Group-Object コマンドレットでは、そのコレクションを受け取り、パイをグループに分類して、各グループのパイの数を追跡します。つまり、Group-Object コマンドレットから次のような情報が返されます。
Count Name Group
----- ---- -----
5 Apple {Apple, Apple, Apple, Apple...}
1 Peach {Peach}
2 Chocolate {Chocolate, Chocolate}
1 Banana Cream {Banana Cream}
1 Blackberry {Blackberry}
3 Pecan {Pecan, Pecan, Pecan}
1 Lemon Meringue {Lemon Meringue}
1 French Silk {French Silk}
1 Raspberry {Raspberry}
1 Strawberry {Strawberry}
1 Key Lime {Key Lime}
では、どうすれば一意のパイを特定できるのでしょうか。それは簡単です。ご覧のとおり、Count プロパティの値で各グループのパイの数を確認できます。グループの Count プロパティの値が 1 の場合、そのパイは一意です。グループの Count プロパティの値が 1 より大きい場合、そのパイは一意ではありません。ただそれだけのことです。
さて、上記のデータを確認し、一意ではないパイを見つけることができました。しかし、空飛ぶ猿ができる作業を私たちが行うのはなぜでしょうか。また、Windows PowerShell で実行できる処理を空飛ぶ猿が行う必要はあるのでしょうか。それは、Group-Object コマンドレットで処理が行われた後、次のようにグループ化されたデータを Where-Object コマンドレットにパイプ処理する必要があるからです。
Where-Object {$_.Count -gt 1}
ここでは、Count プロパティの値が 1 より大きい (-gt) グループ以外のすべてのグループを除外しているだけです。この処理によってどのような結果が得られるのかというと、次のような出力結果が得られます。
Count Name Group
----- ---- -----
5 Apple {Apple, Apple, Apple, Apple...}
2 Chocolate {Chocolate, Chocolate}
3 Pecan {Pecan, Pecan, Pecan}
おっしゃるとおり、このコラムを執筆している Scripting Guy が今日食べた昼食の量と同じくらい、多くの結果が出力されるようですね。
簡単でしたね。ですが、一意ではないパイの Name プロパティの値が必要だとおっしゃるんですね。つまり、Count プロパティと Group プロパティの値は必要でないということですか。お任せください。このことを念頭に置いて、次のように、一意ではないパイのデータを取得して、そのデータを Select-Object コマンドレットにパイプ処理しましょう。
$arrPies | Group-Object | Where-Object {$_.count -gt 1} | Select-Object Name
ご覧のとおり、ここでは、単に Select-Object コマンドレットに Name プロパティの値だけを返すように指示しています。つまり、出力結果は次のようになります。
Name ---- Apple Chocolate Pecan
こちらの方がいいですね。では、一意のパイを特定する必要があったとします。その場合は、次のコード行を使用します。
$arrPies | Group-Object | Where-Object {$_.count -eq 1} | Select-Object Name
このコードでは、Where-Object コマンドレットに、Count プロパティの値が 1 であるグループ以外のすべてのグループを排除するように指示しています。
Where-Object {$_.count -eq 1}
このように処理するとどうなるのかというと、次のような出力結果が得られます。
Name ---- Peach Banana Cream Blackberry Lemon Meringue French Silk Raspberry Strawberry Key Lime
なかなか便利だと思いませんか。
この出力は、Get-Unique コマンドレットによって生成される出力とは異なることをお知らせしておきます (覚えていらっしゃるかもしれませんが、YE さんは質問の中で Get-Unique コマンドレットについて言及していました)。今ご紹介したスクリプトでは、Count プロパティの値が 1 であるグループのみが出力されます。これに対し、Get-Unique コマンドレットを使用すると、Count プロパティの値に関係なく、各項目の種類が 1 つずつ出力されます。つまり、一覧には Peach パイがあるので、Get-Unique コマンドレットの出力には Peach というエントリが 1 つ含まれます。Chocolate パイは 5 つありますが、Get-Unique コマンドレットの出力には Chocolate というエントリが 1 つだけ含まれます。つまり、出力結果は次のようになります。
Apple Banana Cream Blackberry Chocolate French Silk Key Lime Lemon Meringue Peach Pecan Raspberry Strawberry
この一覧を生成するのに使用したコードは、次のとおりです。Get-Unique コマンドレットを使用する際は、次のように、データを並べ替えてから、パイプラインを使用してデータを渡す必要があることに注意してください。
($arrPies | Sort-Object) | Get-Unique
YE さん、これでうまくいくでしょう。興味深く便利なさまざまな方法で、コレクションを取得し、その情報を解析できると思います。Scripting Guys は、スクリプト競技大会関連の作業に戻る必要があります。信じがたいことですが、競技大会は数週間後に迫っています。どのような競技大会の準備作業が残っているのか、ですって。まずは、Don Jones さんが送ってくれた、すてきな賞品が入っている Sapien Technologies 社のギフト バックをひとまとめにする必要があります。そうです。Flingshot Flying Monkey が入っているギフト バックです。Dr. Scripto ボブルヘッド人形、スクリプトに関する書籍、PrimalScript のコピー、PrimalScope のコピー、PowerShell Analyzer のコピー、PowerShell Plus のコピー、SystemScripter のコピー、SpecOps Command の完全なライセンス コピー、50 個ある Windows Vista Ultimate のコピーを獲得することに興味がない方がいらっしゃることはわかっています (詳細については、賞品に関するページを参照してください)。でも、空飛ぶ猿が賞品に加わったので、状況が一変しましたよね。
注 : もちろん、空飛ぶ猿はすべて差し上げるつもりです。何しろ、空飛ぶ猿は Scripting Guys ではなく、スクリプト競技大会の参加者に差し上げる賞品なのですから。 わかりました。正直に言いましょう。輸送時にひどく破損した猿を 1 体だけ自分たち用に取っておくと思います。破損した猿をだれかに押し付けるのはとても心苦しい、というのがその理由です…。 |