Hey, Scripting Guy!

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

Hey, Scripting Guy!

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

詳細情報

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

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

Hey, Scripting Guy! ダウンロード

Spacer

*

Access データベース ファイルが一定のサイズを超えた場合に通知を受け取るようにする方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。Access データベース ファイルが一定のサイズを超えた場合に通知を発生させる方法はありますか。

-- MA

SpacerHey, Scripting Guy! AnswerScript Center

MA さん、こんにちは。つい先日、Microsoft.com の Web ページ「Windows Vista にびっくり 100 回」に "Windows Vista を初めて見たときには驚きのあまり言葉を失うかもしれない" 100 の理由の一覧が掲載されました。

: Scripting Guys のお気に入りの理由は、その 7 の時間を止めることができる、という理由です (実際は、「静止画を楽しめる (You can freeze time)」という理由ですが…)。この響きは非常に良かったのですが、その後 Windows Vista を使用して時間の停止を "解除" する方法に関する情報はありませんでした。もう 1 つお気に入りの理由は、その 13 の詐欺から身を守れる、という理由です。しかし、その後、その記述のすぐ横に Scripting Guys の画像が掲載されていることに気付きました。それはないでしょう。私たちは詐欺などしていません。私たちは・・・。いえ、何でもありません。

ともあれ、理由を一覧表示するというこのやり方はとても良い考えであるため、この方法を盗む…、ではなくて、見習うことにしました。次に、Hey, Scripting Guy! コラムを読むと驚きのあまり言葉を失うかもしれない 100 の理由を示します。

1.

時間を止めることができます。

2.

Hey, Scripting Guy! は、Scripting Guy の息子と彼の野球活動に関するおもしろいエピソードを入手できるインターネット上の唯一の情報源です。

3.

他のライターの編集者は、ライターから中傷されても、そうした辛らつな批評を編集で単純に削除できます。私たちの編集者は、そのような批評を削除できることに気付いていません (彼女が使っているキーボードの Delete キーが壊れていると伝えたところ、彼女はすっかりそれを信じ込んでいます)。

4.

ええと、他には・・・。「時間を止めることができる」ということは言ったでしょうか。ああ、そうでした、言いましたね。

5.

わかりました。では、そうですね。時間を止める、Scripting Guy の息子、編集者、それと・・・。うーん。

しまった、もうこんな時間です。理由のその 6 から 99 までは飛ばして、その 100 だけ言いましょう。

その 100: Microsoft Access データベース ファイルが一定のサイズを超えた場合に通知を発生させるスクリプトを見つけることができます。

つまり、次のスクリプトです。

strComputer = "." 
 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
 
Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ 
    ("SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE " _ 
        & "TargetInstance ISA 'CIM_DataFile' and " _ 
            & "TargetInstance.Name='C:\\Scripts\\Test.mdb'") 
 
Do 
    Set objLatestEvent = colMonitoredEvents.NextEvent 
    If objLatestEvent.TargetInstance.FileSize > 204800 Then 
        Wscript.Echo "The Access database file has exceeded its allowed size." 
    End If 
Loop

では、このスクリプトが機能するしくみをご説明しましょう (理由その 74 : このコラムを執筆している Scripting Guy が、自分のやっていることを実際に理解しているということは保証の限りではありません)。ご覧のとおり、まずローカル コンピュータの WMI サービスに接続します。このスクリプトをリモート コンピュータに対して実行することができるか、ですって。もちろんです。そして、これは良いことです。何しろ、このようなスクリプトは、ローカル コンピュータに対してしか実行できなければ、お世辞にも有用であるとは言えません (理由その 16 : このコラムを執筆している Scripting Guy は、お世辞にも有用とは言えないことについては、世界中のだれよりもよく知っています)。このスクリプトをリモート コンピュータに対して実行する場合に必要な作業は、リモート コンピュータの名前を strComputer 変数に代入するだけです。

strComputer = "atl-dbs-01"

では、次の波乱含みの行に移りましょう。

Set colMonitoredEvents = objWMIService.ExecNotificationQuery _ 
    ("SELECT * FROM __InstanceModificationEvent WITHIN 30 WHERE " _ 
        & "TargetInstance ISA 'CIM_DataFile' and " _ 
            & "TargetInstance.Name='C:\\Scripts\\Test.mdb'")

まず、慌てる必要がないことをお伝えしておきます。これは、指定の WMI イベントに "サブスクライブ" できるようにするためのコード行にすぎません。では、サブスクライブしているイベントとは何でしょうか。__InstanceModificationEvent クラスの新しいインスタンスが作成されるたびに通知を受け取るようにする必要があります。ご想像のとおり、このクラスの新しいインスタンスは、WMI オブジェクト (プロセス、サービス、ディスク ドライブ、ファイルなど) がなんらかの形で変更されるたびに作成されます。もちろん、コンピュータで変更が発生するたびに "毎回" 通知を受け取るのは望ましくありません。毎回受け取っていたら、1 秒ごとに多数の通知を受け取ることになりかねません。代わりに、TargetInstance (つまり、__InstanceModificationEvent クラスの新しいインスタンス) が次の条件を満たす場合のみ、通知を受け取るようにします。

TargetInstance が CIM_DataFile クラスのメンバである (単に、これがフォルダ、プロセス、サービスなどではなくファイルであることを意味します)。

TargetInstance の Name プロパティの値が C:\\Scripts\\Test.mdb である (ご参考までに、Name プロパティにはファイル パスが格納されています)。もちろん、もしそうだとしたら、Name プロパティの値は C:\Scripts\Test.mdb であるべきではないでしょうか。厳密には、そのとおりです。ただし、Where 句で \ という文字を含む値を参照するときには、その文字を必ず "エスケープ" する必要があります。つまり、\ の前にもう 1 つ \ を追加する必要があります。ですから C:\Scripts\Test.mdb は、C:\\Scripts\\Test.mdb となります。

ご参考までに、Test.mdb は偶然にも、ここで監視する必要がある Access データベース ファイルです。

: 鋭いですね。クエリの "WITHIN 30" という部分の用途は何かというと、単にデータベース ファイルが変更されているかどうかを 30 秒おきに確認するようにスクリプトに指示しています (つまり、__InstanceModificationEvent クラスの新しいインスタンス (所定の条件を満たすインスタンス) が作成されているかどうかを確認しています)。30 という値は特殊な値ではなく、単純にファイルが変更されてから 30 秒以内に通知を受け取ることを指定しています。この 30 秒というラグ タイムは、長すぎたり短すぎたりすることがあるかもしれません。そのような場合は、30 を適切な秒数に変更してください (理由その 33 : Hey, Scripting Guy! コラムでは、WMI イベントと WMI イベントの用語を詳説する Webcast へのリンクを提供しています)。

WMI イベント サービスにサブスクライブしたら、無期限に実行する Do ループを設定します (終了条件がどこにも指定されていないことに注意してください)。このループでは、次のコード行を使用して、次のインスタンスの変更イベント (または、少なくともサブスクライブした特定のイベント) が発生するまで待機するようにスクリプトに指示しています。

Set objLatestEvent = colMonitoredEvents.NextEvent

そのようなイベントが発生しない場合はどうなるのか、ですって。問題ありません。前述のとおり、スクリプトは必要であれば無期限に待機します (理由その 56 : Scripting Guy のスクリプトには、ただ待機するだけで何もしないものがあります。まるで Scripting Guys の分身ですね)。ただし、新しいインスタンスの変更イベントが発生したらすぐに、次のコード行を使用して、FileSize プロパティの値が 204,800 (バイト) よりも大きいかどうかを調べます。

If objLatestEvent.TargetInstance.FileSize > 204800 Then

この 204,800 という値についても、何も特別なことはありません。ファイル サイズを指定する必要があったため、この値を使用しただけです。ご参考までに、204,800 バイトは 200 KB (200×1024) です (理由その 29 : 皆さんが計算をしなくてもいいように Scripting Guys が代わりに計算をします。ただし、代数学でなければという条件付きですので、代数学の場合は自力で計算してください)。

では、ファイル サイズが 204,800 バイトを超えた場合はどうなるのでしょう。その場合には、サイズを超えたことを示すメッセージが単純にエコー バックされます。

Wscript.Echo "The Access database file has exceeded its allowed size."

その後、ループ処理の先頭に戻り、同じような次のイベントが発生するまで待機します。

コラムを終える前に、注意点をいくつか手短にお伝えしておきます。まず、このスクリプトは、CScript スクリプト ホストを使用したコマンド ウィンドウで実行したときに最も適切に動作します。そうすれば、表示されるメッセージ ボックスに対応する必要はなく、コマンド ウィンドウのインスタンスを閉じるだけでスクリプトを終了できます。また、このスクリプトは、ただメッセージをエコー バックするのではなく、少し凝った処理を実行できるように、簡単に変更できます。たとえば、イベント ログへのイベントの書き込みや、SMTP メールによる電子メールの送信を行うようにできます。これは皆さんにお任せします (理由その 91 : Scripting Guys は、ほとんどの作業を読者に任せます)。

ところで、MA さんは Microsoft Operations Manager (MOM) を使用しているそうですね。MOM アラートを発生させることができるよう、今日のコラムで紹介したコードを必要に応じて変更できると良いのですが。問題が発生した場合にはお知らせください。だれか手助けしてくれる人をお探しします。私たちが手助けできれば良いのですが、Scripting Guys がほとんど知らないことを 1 つ挙げるとすると (確かに、ほとんど知らないことが少なくとも 1 つあります)、それは MOM です。

とにかく、MA さんのお役に立てばと思います。そして、このコラムで、皆さんに Hey, Scripting Guy! を毎日欠かさず読み続ける理由を提示できたこと願っています。もし十分な理由にならなくても、ご心配なく。今後も、役立つたくさんの情報をお届けします。たとえば、Scripting Guy の Dean Tsaltas と英国オックスフォードの凶暴な牛についてまだ話していませんよね。最高齢の Scripting Guy である Peter Costantini は、さらに年齢を重ねることで科学と自然の法則に逆らい続けています。それに、次の高校野球シーズンがもうすぐです。良い年になると思いますよね。

: 編集者は、「スクリプトに関するさらに多くの情報もご提供します」と追加することを提案しました。それで何か変わるのかはわかりませんが、仕方がありません。はい、スクリプトに関するさらに多くの情報もご提供します。バルセロナへの Scripting Guys の出張はもちろん、今度の Turducken Bowl など、その他にもたくさんあります。

たとえば、時間を止めることなどです。


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