Dsofile: 語られざる物語
評価してください: |
2005 年 3 月 By Scripting Guys トピック Dsofile: 語られざる物語Tales from the Script の執筆を始めたころ、私たちは、スクリプト界のありとあらゆる情報を果敢に集める記者としての自分たちの姿を思い描いていました。Tales from the Script が、その日のスクリプトのトップ記事を発表して他の記者を出し抜き、Microsoft Scripting Guys にしか提供できない詳細な裏話で読者を魅了するだろうと思っていました。事実、私たちの最大の懸念は、ピューリッツァー賞選定委員会に対して丁重に次のことを伝えることができるかということでした。「皆さん、聞いてください。たいへん感謝しておりますが、私たちは毎年受賞しています。今回は気分を変えて、他のだれかに譲るべきだと思います。ニューヨーク市にも新聞はありますよね。彼らにこの賞を送ってはどうでしょう。」 結局のところ、私たちの思い描いたとおりにはなりませんでした。Tales from the Script に満足していないわけではありません。私たちのちょっとしたコラムによって、多くの人々が、スクリプト作成を始めるときの不安を克服し、スクリプトを使って Windows を制御する方が GUI を使って Windows を制御するよりも難しくない (むしろ、簡単である) ことを理解できたと考えています。このことについてはたいへんうれしく思います。それでもやはり、ニューヨーク タイムズの編集局が、「また、Scripting Guys にやられたよ。彼らにはどうしても勝てないな」と言っているところを見たいものです。しかし、今のところ、タイムズが私たちのことを気にしているようすはありません。 告白 わかりました。この件は、私たちの間違いかもしれません。確かに、私たちの最近のコラムの 1 つは、「ビッグフットと結婚したよ」というタイトルでした。しかし、このコラムで "ピューリッツァー賞受賞" と大きく宣伝したわけではありません。 今月は少し事情が違います。3 月の Tales from the Script は、ビッグフットとの結婚とは無関係です。その代わり、他では手に入らない (もちろん、Google などで検索しなければの話ですが) 本物の最新ニュース、ある意味で衝撃的な物語をお届けします。そうです。今月お届けするのは、「Dsofile : 語られざる物語」です。 たった今、苦痛の叫び声が聞こえませんでしたか。多分、ニューヨーク タイムズの編集局のだれかの声でしょう。または、Scripting Guy である Peter Costantini が、彼のお気に入りのビスコッティの種類が Microsoft のカフェテリアで食べられなくなったことに今気付いたかのどちらかです。 Dsofile とは何ですか実は、Dsofile は、Microsoft Developer Support OLE File Property Reader 2.0 Sample のファイル名 (Dsofile.dll) です (Microsoft には、実に覚えやすい名前を考え出す才能があることを認める必要があります)。しかし、名前に惑わされないでください。Dsofile (Microsoft ダウンロード センターから無償で入手することができます) は、スクリプト ライタにとっては非常に便利なツールです。Dsofile は、すべてのファイルの概要情報プロパティ セットの読み取りと書き込みを迅速かつ簡単に行う方法を提供します。 おそらく、このツールに対する最初の反応は、「これはすばらしい。どうして、もっと早く教えてくれなかったのですか」だと思います。そして、次の反応は、「えーと。概要情報プロパティって何ですか」だと思われます。"ファイルの概要情報プロパティ セット" の意味がわからない場合は、次のことを実行してください。エクスプローラまたはマイ コンピュータを開いて、適当なファイルを選択します (どのファイルを選択してもかまいませんが、Microsoft Office 文書を選択することをお勧めします。その理由は数分後に明らかになります)。ファイルを右クリックし、[プロパティ] をクリックします。表示されるダイアログ ボックスの [概要] タブをクリックします。下の図のように表示されます (表示されない場合は、[詳細] をクリックします)。 これが概要情報です。ご覧のように、非常に有効な数多くのメタデータをファイルに追加できることがわかります。さらに重要なことは、そのメタデータを利用できることです。 たとえば、[サブジェクト]、[分類]、および [キーワード] などの項目に入力しておけば、対象を絞った検索を実行して、すばやく簡単にファイルを特定することができます。次のように、Microsoft Office のファイル検索コマンドを使用すると、これらの概要情報プロパティに基づいて文書を検索することができます。同様に、新しい MSN サーチ ツールでもこれらのプロパティに基づいて文書を検索することができます。 私の薬の温度を一定に維持する方法 実際のところ、これはまさにスクリプト ライタが欲しがっている種類の情報です。私たちは、概要情報にアクセスするスクリプトの書き方がわからないとか、概要情報を設定するスクリプトの書き方がわからないという人たちから多くの便りを受け取りました。にもかかわらず、オペレーティング システムに組み込まれたスクリプト ツールには、この機能がありません。確かに、Shell オブジェクトは、この概要情報フィールドのいくつかを読み取ることができます。しかし、Shell オブジェクトは、概要情報フィールドに書き込むことができません。さらに言えば、オペレーティング システムに組み込まれた Windows スクリプト ホスト、ファイル システム オブジェクト、WMI にもこの機能がありません。世の中には良いものがたくさんあるのに、一見したところ、それにアクセスする方法がありません。 ここで、Dsofile の登場です。Dsofile は、スクリプト ライタに、ファイルの概要情報プロパティにアクセスする方法を提供するように設計されています。Dsofile には、一連のプロパティが組み込まれており、これらのプロパティは、偶然にも Microsoft Office 文書の標準になっているものと同じなのです (これは、それほど驚くことではありません。なぜなら、Dsofile は Office チームが開発したものだからです)。Dsofile を使用すると、以下の項目を文書にバインドしたり、これらの項目に関する情報を取得することができます。
前述したように、これらは Microsoft Office 文書のプロパティです。しかし、情報の取得は、Office 文書に限定されるわけではありません。Dsofile を使用すると、他の種類のファイルにもバインドすることができます。たとえば、.vbs ファイルや .mp3 ファイルなどにもバインドすることができます。唯一の注意点は、Dsofile では、上に一覧した以外のプロパティは取得できないということです。たとえば、.jpg ファイルには、Width、Height、Bit Depth、などのプロパティがあります。便利なプロパティですが、Dsofile ではこれらのプロパティにアクセスすることができません。 ちょっと待ってください、Dsofile は新しくないですよ世の中の少数の疑い深い人たちは、次のように言っているかもしれません。「ちょっと待って。これは古いニュースじゃないの。Dsofile が公表されてから何年も経ってるよ。」もちろん、そのとおりです。Dsofile が公表されてから何年も経っているだけでなく、このユーティリティの使い方を紹介するいくつかのサンプル スクリプトをスクリプト センターにも掲載しました。ところが、12 月の初めに Dsofile の新しいバージョンが、ひそやかにリリースされたのです。これが、このコラムを書いた理由であり、最新ニュースをお届けしていると主張する理由です (2 か月は最新のうちに入るということを前提にしていますが)。質問される前に言っておきますが、Dsofile のこの新しいバージョンは、.NET プログラミング言語と共に使用するように設計されています。私たちの知る限り、このバージョンには、古いバージョンになかった機能が追加されているわけではありません。 Dsofile の新しいバージョンと古いバージョンの違いは、Dsofile の機能を利用するスクリプトです。Dsofile の古いバージョンを持っていて、新しいバージョンをダウンロードしてインストールしたと仮定します。古い Dsofile スクリプト (スクリプト センターにあるものと同じスクリプト) は、新しいバージョンの Dsofile では動作しません。これは、古いバージョンを使用するために必要なスクリプト コードと新しいバージョンを使用するために必要なスクリプト コードに多くの違いがあるためです。 たとえば、次に示すのは、Dsofile の古いバージョンを使用して、文書の作者 (Author) の名前を取得するスクリプトです。 何は、総心拍出量の反射制御を制御する? | 新着情報を入手する |
Set objPropertyReader = CreateObject("DSOleFile.PropertyReader") Set objDocument = objPropertyReader.GetDocumentProperties _ ("C:\Scripts\New_users.xls") Wscript.Echo "Author: " & objDocument.Author Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") Wscript.Echo "Author: " & objFile.SummaryProperties.Author
そして、次のスクリプトは、上と同じスクリプトを Dsofile の新しいバージョンで動作するように書き直したものです。
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") Wscript.Echo "Author: " & objFile.SummaryProperties.Author
ご覧のように、どちらのスクリプトも文書の作者 (Author) を返しますが、共通しているのはそれだけです。ProgId (DSOleFile.PropertyReader と DSOFile.OleDocumentProperties) さえ違っています。残念なことに、Dsofile と共にリリースされた付属文書にもこのことは明記されていません。慎重さに欠けている人 (Scripting Guys にも少なくとも 1 人はいます) は、新しいバージョンをインストールして、古いスクリプトが動かなくなった理由を解明するために多くの時間を費やすことになるでしょう。
かなり疑い深い人たちは、「すごいね。でも、本当に Office アプリケーションのインスタンスを作るだけで同じ情報にアクセスできるのかな」と思うかもしれません。はい、できます。ただし、Dsofile を使用する意義は、Microsoft Office のような他のアプリケーションからはアクセスできない独特な情報にアクセスできるということではなく、これ以外は実行する必要がないということです。Dsofile を使用するスクリプトは、Microsoft Office を使用するスクリプトよりも迅速に情報を返します。これは、Word や Excel のインスタンスを作成しなくても、文書の作者を特定することができるからです。Dsofile は、Office アプリケーションを起動するオーバーヘッドがないため、これまでよりも速く、しかも容易に同じ情報を取得できます。これが、Dsofile がッ非常に便利なツールとなっている理由です。
わかりました、でも Dsofile はどのように使うのですか
いい質問ですね。今年、スクリプトのピューリッツァー賞を受賞するためには、私たちはいくつかのコードを示す必要があるかもしれません (それと、スクリプトのピューリッツァー賞が実際に制定される必要もあります)。それでは、文書の作者を返す私たちのスクリプトをじっくりご覧ください。
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") Wscript.Echo "Author: " & objFile.SummaryProperties.Author
ご覧のように、まず、DSOFile.OleDocumentProperties オブジェクトのインスタンスを作成します。次に、Open メソッドを使って、ファイルを "開きます" ("開きます" という言葉を引用符で囲っているのは、Microsoft Excel のようなアプリケーションを起動して文書をロードするという意味合いでファイルを開いているわけではないからです。そうではなく、実際に行っているのは、ファイルに付属する概要情報のメタデータにバインドすることだけです)。
このバインドを実施したら、あとは、必要な概要情報プロパティの値を表示するだけです。難しく考える必要はありません。注意点は、SummaryProperties オブジェクトを参照する必要があるということだけです。そのために、objFile.Author ではなく objFile.SummaryProperties.Author を使用しています。ただし、難しいと思えるのはこの部分だけです。ここには、私たち全員をスクリプト嫌いにさせた配列や厄介な日付変換はありません。
ここで、C:\Scripts\New_users.xls ファイルのすべての概要情報値を取得する、さらに複雑なスクリプトを紹介します。Dsofile には、スライドとは無関係のファイルで SlideCount などのプロパティを表示しようとしてもエラーが発生しない、という長所もあります。エラーは発生せずに、スクリプトは Null 値 (数値プロパティの場合は 0) を返し、そのまま処理を継続します。これは、テキスト ファイルや Windows Media ファイル、またはその他の Microsoft Office 以外の文書から情報を取得する場合も同様です。
以下にコードを示します。
何が卵母細胞が子宮に移動するのに役立つ
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") Wscript.Echo "Application name: " & objFile.SummaryProperties.ApplicationName Wscript.Echo "Author: " & objFile.SummaryProperties.Author Wscript.Echo "Byte count: " & objFile.SummaryProperties.ByteCount Wscript.Echo "Category: " & objFile.SummaryProperties.Category Wscript.Echo "Character count: " & objFile.SummaryProperties.CharacterCount Wscript.Echo "Character count with spaces: " & objFile.SummaryProperties.CharacterCountWithSpaces Wscript.Echo "Comments: " & objFile.SummaryProperties.Comments Wscript.Echo "Company: " & objFile.SummaryProperties.Company Wscript.Echo "Date created: " & objFile.SummaryProperties.DateCreated Wscript.Echo "Date last printed: " & objFile.SummaryProperties.DateLastPrinted Wscript.Echo "Date last saved: " & objFile.SummaryProperties.DateLastSaved Wscript.Echo "Hidden slide count: " & objFile.SummaryProperties.HiddenSlideCount Wscript.Echo "Keywords: " & objFile.SummaryProperties.Keywords Wscript.Echo "Last saved by: " & objFile.SummaryProperties.LastSavedBy Wscript.Echo "Line count: " & objFile.SummaryProperties.LineCount Wscript.Echo "Manager: " & objFile.SummaryProperties.Manager Wscript.Echo "Multimedia clip count: " & objFile.SummaryProperties.MultimediaClipCount Wscript.Echo "Note count: " & objFile.SummaryProperties.NoteCount Wscript.Echo "Page count: " & objFile.SummaryProperties.PageCount Wscript.Echo "Paragraph count: " & objFile.SummaryProperties.ParagraphCount Wscript.Echo "Presentation format: " & objFile.SummaryProperties.PresentationFormat Wscript.Echo "Revision number: " & objFile.SummaryProperties.RevisionNumber Wscript.Echo "Shared document: " & objFile.SummaryProperties.SharedDocument Wscript.Echo "Slide count: " & objFile.SummaryProperties.SlideCount Wscript.Echo "Subject: " & objFile.SummaryProperties.Subject Wscript.Echo "Template: " & objFile.SummaryProperties.Template Wscript.Echo "Title: " & objFile.SummaryProperties.Title Wscript.Echo "Total edit time: " & objFile.SummaryProperties.TotalEditTime Wscript.Echo "Version: " & objFile.SummaryProperties.Version Wscript.Echo "Word count: " & objFile.SummaryProperties.WordCount
もちろん、概要情報の取得は、行いたいことの半分に過ぎません。スクリプト ライタなら、これらのプロパティ値を設定できるようにしたいはずです。皆さんは運がいいですね。文書にタイトルを付けたいのですか。それでは、このスクリプトを使ってください。
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") objFile.SummaryProperties.Title = "New title added via a script" objFile.Save
ここでも、OleDocumentProperties オブジェクトのインスタンスを作成してから、Open メソッドを呼び出してファイルを開きます。"New title added via a script" というタイトルを SummaryProperties.Title に代入し、Save メソッドを呼び出します。これだけです。文書タイトルを完全に削除するには、次のようにプロパティ値を空の文字列に設定する必要があります。
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") objFile.SummaryProperties.Title = "" objFile.Save
Dsofile の欠点は、Microsoft Office 文書の概要情報フィールドにしか書き込めないということです。いわゆるテキスト ファイル (.txt ファイル) にタイトルを付けようとすると失敗します。人生の悲しい現実の 1 つです。それから、すべてのプロパティが書き込み可能ではなく、一部は読み取り専用であることも覚えておいてください。Dsofile を使って、文書のタイトルやサブジェクトを変更することはできますが、言うまでもなく、ByteCount (バイト数) や DateCreated (作成日) のプロパティを変更することはできません。
これだけではありません
おそらく、大規模なスクリプト ニュースの組織で働いている標準的なスクリプト記者なら、Dsofile に関するすべてのことを話し終えたと確信して、ここで止めてしまったでしょう。しかし、Scripting Guys がそんな簡単に諦めるタイプだと思いますか。
いや、実はそのとおりです。私たちはそういうタイプです。しかし、編集長から、「ところで、文書のカスタム プロパティについてはどうなっているの。読者がそれについて知りたいはずだとは考えないの」と言われてしまったのです。彼女の身長が 3 メートルを超えて、目から火が出そうな剣幕だったので、私たちは、「わ、わかりました」と言うしかありませんでした (身長が 3 メートルを超えて、目から火が出そうな剣幕だったという部分を彼女が削除しなかったところを見ると、それが明白な事実であることを指摘してもいいかもしれません)。
さて、文書のカスタム プロパティついてはどうなのでしょうか。前述したように、Microsoft Office 文書には、数十個の文書プロパティが組み込まれています。ただし、これらの文書プロパティでも、あなたのニーズを十分に満たすことができなかったらどうしますか。安心してください。まったく問題はありません。独自のプロパティを Microsoft Office 文書に追加することができます。
たとえば、文書が最後にレビューされた日付を記録したい場合を想定します。組み込みの文書プロパティには、Date Reviewed (レビュー日) というプロパティは含まれていません。でも大丈夫です。次のスクリプトのように、独自のプロパティを作成するだけです。
Const msoPropertyTypeDate = 3 Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") objFile.CustomProperties.Add "Date Reviewed", msoPropertyTypeDate objFile.Save
ここでは、まず、msoPropertyTypeDate という名前の定数を定義して、これに値として 3 を代入します。これによって、追加するカスタム プロパティが日付フィールドであることが Dsofile に指示されます。カスタム プロパティの種類は、以下のいずれかになります。
定数 | データ型 | 値 |
msoPropertyTypeNumber | 数値型 | 1 |
msoPropertyTypeBoolean | ブール型 (Yes/No) | 2 |
msoPropertyTypeDate | 日付型 | 3 |
msoPropertyTypeString | 文字列型 | 4 |
たとえば、Document Reviewed プロパティを、文書がレビューされたかどうかを単に示すために追加する場合は、次のスクリプトのように、ブール型のプロパティとして追加できます。
Const msoPropertyTypeBoolean = 2 Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") objFile.CustomProperties.Add "Document Reviewed", msoPropertyTypeBoolean objFile.Save
では、Date Reviewed プロパティに戻りましょう。文書にバインドし、CustomProperties コレクションにアクセスして、Add メソッドを呼び出します。このとき、2 つのパラメータ (新しいプロパティに付ける名前 (Date Reviewed) とデータ型 (msoPropertyTypeDate)) を渡します。それから、Save メソッドを呼び出し、新しいプロパティを CustomProperties コレクションに保存します。
新しいカスタム プロパティを作成するスクリプトを実行するときに、実際に行うことは、情報が保存できる場所を設定することです。既定では、その場所には何の情報も保存されません (つまり、Date Reviewed を格納できる場所はあるけれども、空になるということです)。さらに、この新しいプロパティは、値を代入するまで、[プロパティ] ダイアログ ボックスには表示されません。そうですね、この新しいプロパティに値を代入する方法を説明した方がよさそうですね。
値を代入するには、次のようなスクリプトを使用する必要があります。
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") Set objProperty = objFile.CustomProperties.Item("Date Reviewed") objProperty.Value = #2/16/2005# objFile.Save
ここでは、まず、C:\Scripts\New_users.xls ファイルにバインドします。次に、カスタム プロパティへのプロパティ参照を作成します。これは、次のコード行で実現されます。
Set objProperty = objFile.CustomProperties.Item("Date Reviewed")
プロパティの値を設定してから、Save メソッドを呼び出して変更を保存します。以上です。これで、Date Reviewed プロパティに値として 2/16/2005 が格納されます。プロパティに値を代入したところで、New_users.xls の [プロパティ] ダイアログ ボックスをチェックして、次のように表示されることを確認する必要があります。
ところで、日付が 2 つのシャープ記号 (#) で囲まれているのは、日付データが文字列やある種の数式 (2 を 16 で除算し、さらに 2005 で除算するような数式) ではなく日付として渡されることを保証するための標準的な VBScript メソッドです。
わかり切ったことですが、もちろん、そのとおりです。これは、ピューリッツァー賞よりもノーベル賞に値するものです。いいえ、それ以上です (「ノーベル賞を受賞する以上のことって何ですか」と疑問に思っている人は、Dsofile について十分に理解していないのではないでしょうか)。文書に関連付けられたすべてのカスタム プロパティの値を取得するために、エクスプローラを使用する必要はありません。その代わり、次のようなスクリプトを使用することができます。
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") For Each objProperty in objFile.CustomProperties Wscript.Echo objProperty.Name, objProperty.Value Next
CustomProperties はコレクションなので、For Each ループを使ってコレクション内のすべての項目を読み取って、プロパティ名とそこに代入されている値を表示します。とても簡単ですね。
それでは、このカスタム プロパティを削除するにはどうすればよいのでしょう。その答えは、次のように、文書にバインドして、削除するプロパティへのオブジェクト参照を設定してから、Remove メソッドを呼び出します。
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:\Scripts\New_users.xls") Set objProperty = objFile.CustomProperties.Item("Date Reviewed") objProperty.Remove objFile.Save
ここでも、必ず、Save メソッドを呼び出して、カスタム プロパティ セットへの変更を保存してください。
ピューリッツァー賞選定委員会に感謝したいと思います
しかし、その予定はありません。まだ、ピューリッツァー賞を授与されていないからです。それでも、私たちは Dsofile の便利さがわかってもらえることを期待しています。私たちが行おうとしていることは、スクリプトに関する皆さんの視野を少し広げることだけです。覚えていますか。先月は、オペレーティング システムには同梱されていませんが、スクリプト ライタにとって非常に便利な別のツールとして、ログこそすべて (Log Parser について) を紹介しました。Dsofile を試した感想を聞かせてください (いつものように、scripte(英語のみ) までお送りください)。
このツールの便利さを理解できれば、今度、ピューリッツァー賞選定委員会のだれかと話すときに Scripting Guys について言及することができます。とりあえず、私たちはおろかにも慌てて買いに行ったタキシードを片付けなければなりません。
0 コメント:
コメントを投稿