Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード

Spacer

*

.JPG ファイルから "写真撮影日" のプロパティを取得する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。.JPG ファイルから "写真撮影日" のプロパティを取得する方法はありますか。

-- MW

SpacerHey, Scripting Guy! AnswerScript Center

MW さん、こんにちは。回答の前に、今回を最後に "Hey, Scripting Guy!" のコラムをしばらく中断する可能性があることをお伝えしなければなりません。別にどこかへ行くわけではなくて、土曜日に、全米放映されるフットボールの試合でシアトル・シーホークスがダラス・カウボーイズをホームに迎えて戦うのです。ここで問題発生です。12 月初めに全米放映試合でシーホークスがグリーンベイをホームに迎えたとき、シアトル地域はちょうど氷雨まじりの暴風に襲われ、2 日間にわたって街が閉鎖されました。クリスマスの直前には、全米放映試合でシーホークスがサンフランシスコ・フォーティナイナーズをホームに迎えました。同じ日の夜、"100 年に 1 度" の嵐がこの地域を襲い、何よりこのコラムを担当する Scripting Guy が寒い中 6 日間も停電に見舞われました。確かに確率から考えると、このようなひどい事態はもう起きないと思われます。にもかかわらず、このコラムを担当する Scripting Guy は用心のために裏庭で箱舟を作っていたのです。後は全種類の動物を 2 匹ずつかき集めてくるだけです。そして計画を実行するでしょう。

もちろん、次の災害が襲ってくるまでに少しでも時間があるのなら、私たちは皆さんのために解決策を探すべきでしょう。実のところ、1 か月ほど前ならこの質問にすんなり回答できたのです。「MW さん、申し訳ありませんが、少なくともスクリプトを使わずにこの情報を取得する方法はありません」と。ただし、それは Microsoft が Windows デスクトップ サーチ 3.0 (英語) をリリースする前の話です。今はスクリプトを使ってデジタル写真の撮影日を確認することができます。

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"

objRecordSet.Open "SELECT System.FileName, System.Photo.DateTaken FROM SYSTEMINDEX " & _
    "Where System.ItemFolderPathDisplay = 'D:\Europe' and System.FileExtension = '.jpg'", _
    objConnection

objRecordSet.MoveFirst

Do Until objRecordset.EOF
    Wscript.Echo objRecordset.Fields.Item("System.FileName"), _
        objRecordset.Fields.Item("System.Photo.DateTaken")
    objRecordset.MoveNext
Loop

このスクリプトのしくみを説明する前に、いくつか注意しておきます。このソリューションを利用するには、何よりも先に Windows デスクトップ サーチ 3.0 をインストールする必要があります。方法については、こちら (英語)をご覧ください。これはまんざら悪い話ではありません。セットアップは簡単ですし、デスクトップ サーチ 3.0 にはデジタル写真の撮影日を確認する他にもさまざまな使い道があります。2 番目の注意点として、このソリューションは Windows XP、Windows Server 2003、そして Windows Vista にしか対応していません。デスクトップ サーチ 3.0 を利用できるのがこれらのプラットフォームに限られているからです。この点は今後変わるでしょうか。正直なところわかりません。ですが、デスクトップ サーチはよくできたテクノロジなので、変わることを願っています。

スクリプト自体に関しては、まず 2 つのオブジェクトの作成から始めます。1 つは ADODB.Connection、もう 1 つは ADODB.Recordset です。この 2 つの名前に心当たりがあるのも当然です。この 2 つは、ActiveX データ オブジェクト (ADO) で使用される基本的なオブジェクトです。ADO はテキスト ファイル (英語)Active Directory (英語)、そしてもちろんデータベース (英語)などの各種データ ソースに接続して操作できるようにするスクリプト テクノロジです。デスクトップ サーチ 3.0 の良いところは、ADO スクリプトの作成方法を知っていれば、デスクトップ サーチ スクリプトの作成方法がほとんどわかるという点です。

Connection オブジェクトと Recordset オブジェクトを作成したら、Open メソッドを使用してデスクトップ サーチのデータ ストアに接続します。次のコードは、詳細を気にせずに、デスクトップ サーチ 3.0 を使用するときに貼り付ける定型コードと考えてください。

objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"

接続を確立したら、次のコードを使用して D:\Europe フォルダで見つかったすべての .JPG ファイルの FileName プロパティと DateTaken プロパティを返します。

objRecordSet.Open "SELECT System.FileName, System.Photo.DateTaken FROM SYSTEMINDEX " & _
    "Where System.ItemFolderPathDisplay = 'D:\Europe' and System.FileExtension = '.jpg'", _
    objConnection

これで、単一ファイル、またはコンピュータ上のすべての .JPG ファイルについて、この情報を簡単に返すことができます (このスクリプトの実行に膨大な時間がかかると思っていませんか。まだデスクトップ サーチ 3.0 を試していませんね)。デスクトップ サーチ 3.0 に関する質問の詳細については、「尋ねよ、さらば見いださん」を参照してください。今のところは、SYSTEMINDEX データ ストア (デスクトップ サーチで唯一使用できるデータ ストア) から 2 つのプロパティ値 (System.FileName と System.Photo.DateTaken) を取得する基本的な SQL ステートメントを使用していることに注目してください。同様に、返されるデータを D:\Europe フォルダで見つかった項目 (つまり ItemFolderPathDisplay が "D:\Europe" である項目) に限定する Where 句に注意し、さらに FileExtension を ".jpg" にします。

もちろん、WMI とは違って、ファイル拡張子にはドットを含める必要があります。

Open メソッドを実行すると、D:\Europe フォルダで見つかったすべての .JPG ファイルを含んだレコードセットがデスクトップ サーチから返されます (指定したとおりです)。ここで、レコードセットをループ処理する (つまりレコードセットの EOF (ファイルの終わり) プロパティが True になるまで実行される) Do Until ループを設定します。このループ内ではファイル名と写真の撮影日をエコー バックし、その後に MoveNext メソッドを使用してレコードセットの次の項目に移動し、同じ情報をエコー バックします。そのためのコードは次のようになります。

Do Until objRecordset.EOF
    Wscript.Echo objRecordset.Fields.Item("System.FileName"), _
        objRecordset.Fields.Item("System.Photo.DateTaken")
    objRecordset.MoveNext
Loop

これで終わりです。このスクリプトを実行すると、次のような情報が返されます。

europe001.jpg 8/16/2005 11:22:30 AM
europe002.jpg 8/16/2005 11:22:49 AM
europe003.jpg 8/16/2005 11:23:02 AM
europe004.jpg 8/16/2005 11:24:41 AM
europe005.jpg 8/16/2005 11:25:14 AM

何より、この情報はわずか数秒で取得できます。すばらしいですね。

さて、Scripting Guy の面々は試合の時間が徐々に近づいて神経質になっているでしょうか。実はそれほどでもありません。何といっても Microsoft は価値の高い社員が災害で大変な目に遭わないように、Scripting Guy らとみんなで試合を観戦する予定だからです。

注 : 救われるのは、何が起こっても (もうどんな災難が起きても驚きませんが) この試合がシーホークスの今年最後のホーム ゲームになることです。ああ良かった。可もなく不可もないシーズンで。


ページのトップへページのトップへ