
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。Windows PowerShell を使用してコンピュータ上のすべての .wma ファイルを見つける方法はありますか。
-- LC

LC さん、こんにちは。ハリー・ポッター。ホグワーツ。ロン・ウィーズリー。ダンブルドア。クィディッチ。
これらが何かというと、特に意味はありません。単に、このコラムを書いている Scripting Guy の頭に浮かんだ言葉です。聞かれる前にお答えすると、これらの言葉は、最近、意見の相違、そう、この架空の人物やゲームについて展開した意見に部分的に相違があった編集者に対する遠回しな攻撃ではありません。ご想像のとおり、このコラムを書いている Scripting Guy は、この編集者と彼女の意見に対して、ただ最大限の敬意のみを払っています。
たとえ彼女がただのマグルであったとしてもです。
ですから、ここに、隠れた意図があるわけではありません。何かあるとすれば、このコラムを書いている Scripting Guy がハリー・ポッターについて言及したのは、単に、今回の質問に対する回答が、ハリーとその友達が精通している魔術と同じように魔法のようであると言いたいためです。
Get-WMIObject Win32_LogicalDisk -filter "DriveType = 3" |
Select-Object DeviceID |
ForEach-Object {Get-Childitem ($_.DeviceID + "\") -include *.wma -recurse}
注 : もちろん、彼女もそう思うに決まっています。 |
おそらく既にご承知のとおり、Windows PowerShell は、ここ、マイクロソフトの優秀な仲間たちによってリリースされた新しいコマンド シェルおよびスクリプト言語です (Windows PowerShell についてまだ聞いたことがなくても、すぐに聞くことになります。実際、近日中に、まさにこのスクリプト センターで重要な発表が行われる予定です)。Windows PowerShell は、興味深いテクノロジであり、明確な長所があります。VBScript よりも優れているか、という質問は、バニラはチョコレートよりもおいしいか、と聞いているようなものです。その答えは、その人自身とその人の好みによります。ただし、どちらにしても、Windows PowerShell によってこの問題を容易に、また最小限の労力で解決できることは確かです。
注 : 念のために記しておくと、バニラよりも、チョコレートの方がおいしいです。もちろん、編集者はきっと大好きな味なしゼラチンを選ぶでしょう。それで問題はありません。彼女には、自分の意見を持つ完全な権利があります。 たとえそれが完全に間違っていたとしてもです。 |
さて、ここから本題に入りましょう。コンピュータ上のすべての .wma ファイルを見つけるには、次の 3 つの手順を実行する必要があります。
| • | コンピュータに搭載されているすべてのハード ドライブの一覧を取得します。 |
| • | これらの各ドライブのドライブ文字を取得します。 |
| • | 各ドライブの中のすべての .wma ファイルを検索します。 |
このことを念頭に置いて、手順 1. を開始します。手順 1. では、コンピュータに搭載されているすべてのハード ドライブの一覧を取得します (なお、複数の異なる行のように見えますが、コマンド全体を同じ行に入力する必要があります)。
ハード ドライブの一覧を取得するには複数の異なる方法がありますが、ここでは WMI および GetWMIObject cmdlet を使用します。この方法は、動作の有効性が確認されているだけでなく、VBScript には精通していても Windows PowerShell には精通していないユーザーにも使いやすさが保証される方法です。次に示すのは、ローカル コンピュータ上のディスク ドライブの一覧を取得するコマンドです。
Get-WMIObject Win32_LogicalDisk -filter "DriveType = 3"
ご覧のとおり、特別難しいことはしていません。まず、単純に Get-WMIObject cmdlet を呼び出し、次に、接続先の WMI クラスの名前 (Win32_LogicalDisk) を指定します。その後、-filter パラメータを追加します。これは、WMI の Select * From クエリから "Select * From" と "Where" という語を引いたものとほぼ同じです。VBScript では、次のようなクエリを使用します。
"Select * From Win32_LogicalDisk Where DriveType = 3”
Windows PowerShell では、次のようなフィルタを使用します。
"DriveType = 3"
どうですか。少しも難しいことはありません。
このコマンドを実行すると、コンピュータ上の全ハード ディスクの全プロパティで構成されるコレクションが返されます (DriveType が 3 の論理ディスクはすべてハード ディスクです)。これはすばらしいことですが、実際に必要なのは、これらの各ハード ディスクのドライブ文字だけです。したがって、このコレクションを Select-Object cmdlet にパイプします (記号 | はパイプラインを表します)。これはどういうことかというと、コレクションの取得には Get-WMIObject を使用しますが、Get-WMIObject を使用してさらに操作を続行するのではなく、コレクションを Select-Object に渡すことを意味します。その後、その Select-Object cmdlet を使用して、唯一の目的のプロパティである DeviceID を選択します。
Select-Object DeviceID
コンピュータ上のすべてのハード ドライブから構成されるコレクションはまだ保持していますが、DeviceID 以外のすべてのプロパティ値は削除されています。これにより、次のようなコレクションが残されます。
C: D: E:
続いて、このコレクションを再度パイプする必要があります。今回は、不要なものが削除されたコレクションを ForEach-Object cmdlet に渡します。ForEach-Object cmdlet は、ハード ディスクのセットをループし、コレクションの各ドライブに対して Get-ChildItem cmdlet を使用します。Get-ChildItem は、その名のとおり、指定されたコンテナにあるすべての項目 (フォルダ内のすべてのファイルおよびサブフォルダなど) を取得できる cmdlet です。
コマンドは次のようになります。
ForEach-Object {Get-Childitem ($_.DeviceID + "\") -include *.wma -recurse}
つまり、ドライブごとに Get-ChildItem を呼び出し、ルート フォルダ (C:\ など) に cmdlet をバインドします。ルート フォルダを指定するため、$_.DeviceID に続けて \ を使用します。ご参考までに、Windows PowerShell では、$_ は現在使用されているオブジェクトを表す特別な変数です。つまり、ループの 1 巡目では、$_.DeviceID はコレクションの最初のアイテムの DeviceID プロパティである C: を表します。
また、Get-ChildItem には次の 2 つのパラメータを渡しています。
| • | -include *.wma: これは、返されるデータを、拡張子が .wma のファイルに制限するフィルタ パラメータです。 |
| • | -recurse: このパラメータを渡すと、自動的に対象フォルダのすべてのサブフォルダが検索されます。ここでは対象フォルダが C:\ なので、cmdlet はドライブ C のすべてのフォルダを検索します。 |
注 : ドライブ C にあるすべてのフォルダを検索するには、-recurse パラメータを追加する必要があるだけです。WMI または FileSystemObject を使用しているときのように、再帰的なサブルーチンを記述する必要はありません。うーん、やはりこれは魔法かもしれません。 |
ドライブ C に Get-ChildItem を実行した後は、コレクションの次のドライブにループ処理および C と同様の処理を行います。VBScript の For Each ループとちょうど同じような動作をします (構文は異なりますが概念は同様です)。
ところで、このスクリプトは非常に短時間で実行されることがわかります。試してみて結果をご覧になってください。
さて、どこまで説明したでしょうか。そうでした。ハグリッド。グリフィンドール。ヴォルデモート。ハーマイオニー・グレンジャー。
注 : ちょうど今ごろ、編集者の頭にも言いたいことがランダムに浮かんでいるに違いありません。しかし、編集者としてそのようなことは検閲する必要があり、少なくともこの TechNet では、本当に言いたいことは言えません。これでどうだ、編集者。 |
編集者注 : そのとおり、編集者には、Scripting Guy に対して TechNet では言えないことがたくさんあります。ただし、次の言葉は TechNet に書けます。訴訟、弁護士、著作権、商標権、失業、破産、車中生活、Scripting Guy の息子の車での車中生活 (最後に本当に怖いものに行き当たりましたね)。 |