Hey, Scripting Guy!

Hey, Scripting Guy!

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

Hey, Scripting Guy! アーカイブも忘れずにチェックしてください。

今日の質問 : 現在の画面の内容を問わず、画面への出力を上書きする方法はありますか


現在の画面の内容を問わず、画面への出力を上書きする方法はありますか

Q

Scripting Guy さん、よろしくお願いします。現在の画面の内容を問わず、画面への出力を上書きする方法はありますか。

-- KM

A

KM さん、こんにちは。特に、コマンド ウィンドウに出力を書き込む必要があるという場合、この質問にお答えすることはできません。いくつか試してみましたが、コマンド ウィンドウの情報を上書きする簡単明瞭な方法は見つかりませんでした。

しかし、Internet Explorer ウィンドウに情報を出力したいということであれば、質問にお答えできます。さらに、偶然にも、すぐに答えが出せます。次のとおりです。

Set objExplorer = CreateObject("InternetExplorer.Application") 
objExplorer.Navigate "about:blank"    
objExplorer.ToolBar = 0 
objExplorer.StatusBar = 0 
objExplorer.Width = 400 
objExplorer.Height = 200  
objExplorer.Left = 0 
objExplorer.Top = 0 
 
Do While (objExplorer.Busy) 
    Wscript.Sleep 200 
Loop     
 
objExplorer.Document.Title = "Process Information"    
objExplorer.Visible = 1   
         
objExplorer.Document.Body.InnerHTML = "Retrieving process information."  
 
Wscript.Sleep 2000 
 
strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colItems = objWMIService.ExecQuery("Select * from Win32_Process") 
For Each objItem in colItems 
    objExplorer.Document.Body.InnerHTML = objItem.Name 
    Wscript.Sleep 500 
Next 
 
objExplorer.Document.Body.InnerHTML = "Process information retrieved." 
Wscript.Sleep 3000 
objExplorer.Quit

少し長く見えますが、すぐにわかってしまうほど実に簡単です。たとえば、次のコードのブロックは、一見少し厄介であるように見えるかもしれません。

Set objExplorer = CreateObject("InternetExplorer.Application") 
objExplorer.Navigate "about:blank"    
objExplorer.ToolBar = 0 
objExplorer.StatusBar = 0 
objExplorer.Width = 400 
objExplorer.Height = 200  
objExplorer.Left = 0 
objExplorer.Top = 0

でも、結局のところ、実行しているのはすべて、Internet Explorer の空白のインスタンスの作成です。これは特に、コードの最初の 2 行が実行しています。コードの残りの行では、次のように Internet Explorer ウィンドウのさまざまなプロパティを単に構成しているだけです。幅を 400 ピクセルに設定し、ツール バーを非表示にし、Internet Explorer ウィンドウを画面左上に配置します。Internet Explorer ウィンドウの既定の構成で問題ない場合は、行 3 〜 8 は省略して構いません。

Internet Explorer ウィンドウの設定が完了したら、次の Do While ループを使用して、Internet Explorer が完全にロードされるまでスクリプトを一時停止します。

Do While (objExplorer.Busy) 
    Wscript.Sleep 200 
Loop

どうですか。なかなかいいでしょう。Internet Explorer を起動して実行し、次に Internet Explorer ウィンドウのタイトルを指定して、Visible プロパティを True (1) に設定します。そのときまで Internet Explorer は、非表示のウィンドウで実行されており、画面上に表示されていなかったため、この処理が必要です。しかし、このコードでその小さな問題に対処できます。

objExplorer.Document.Title = "Process Information"    
objExplorer.Visible = 1

これで、ウィンドウに書き込む準備ができました。このサンプル スクリプトでは、ウィンドウへの書き込みは次のように簡単です。

objExplorer.Document.Body.InnerHTML = "Retrieving process information."

ご覧のように、Document.Body オブジェクトの InnerHTML プロパティに値を割り当てるだけです。この例では、InnerHTML に、Retrieving process information というテキストを割り当てているだけです。ただし、複数の HTML タグを追加して、もっと手の込んだ出力を簡単に作成することができます。たとえば、次のコード行では、テキストが太字でウィンドウに書き込まれます。

objExplorer.Document.Body.InnerHTML = "<B>Retrieving process information.</B>"

そうですね。これでは手が込んでいるとは言えないかもしれませんね。でも言いたいことはわかっていただけたでしょう。

Internet Explorer ウィンドウでテキスト文字列を表示した後、次に、2 秒 (2000 ミリ秒) 間スクリプトを一時停止させます。一時停止する必要があるわけではないのですが、単に上書きする前にテキストを確認できるので、一時停止します。

では、次のブロックに移りましょう。

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
Set colItems = objWMIService.ExecQuery("Select * from Win32_Process") 
For Each objItem in colItems 
    objExplorer.Document.Body.InnerHTML = objItem.Name 
    Wscript.Sleep 500 
Next

これは、ローカル コンピュータで実行されているプロセスのコレクションを取得する操作です。それほど重要ではありませんが、皆さんが興味を持つようなことをスクリプトに実行させなければなりません。ここで重要なのは、コレクション内のすべてのアイテムを順番に処理するように設定した For Each ループ内でどのような処理が行われているかということです。

For Each objItem in colItems 
    objExplorer.Document.Body.InnerHTML = objItem.Name 
    Wscript.Sleep 500 
Next

ほとんどの WMI スクリプトでは、For Each ループ内でプロパティ値 (Name など) を表示します。ただし、ここでは Wscript.Echo を使用しません。代わりに、コレクション内の最初のプロセスの名前を本文の InnerHTML プロパティに割り当てます。

objExplorer.Document.Body.InnerHTML = objItem.Name

何をするのでしょうか。Internet Explorer ウィンドウの既存の内容を、コレクションの最初のプロセスの名前で上書きしようとしているのです。たとえば、ループの開始時には Internet Explorer ウィンドウには次のテキストが含まれています。

Retrieving process information.

ループの実行を開始すると、このテキストはコレクションの最初のプロセスの名前に置き換えられます。次に例を示します。

Winword.exe.

ウィンドウの内容が上書きされた後は、スクリプトを 0.5 秒 (500 ミリ秒) 間一時停止させます。ここでも、一時停止させる必要はないのですが、少しスクリプトの速度を低下させて、最初のプロセスの名前が表示されるのを確認できるようにします。0.5 秒後にループの先頭に戻り、コレクションの 2 番目のプロセスについての情報を取得します。スクリプトによって、Internet Explorer ウィンドウの既存の内容 (厳密には、InnerHTML プロパティに割り当てられた値) は、2 番目のプロセスの名前に置き換えられます。その後、同様の処理が繰り返されます。

コレクション全体のループが完了したら、スクリプトが終了したことを示し、3 秒間一時停止した後、Internet Explorer ウィンドウが終了します。

objExplorer.Document.Body.InnerHTML = "Process information retrieved." 
Wscript.Sleep 3000 
objExplorer.Quit

これはとてもうまく機能するうえ、とても簡単です。それに、HTML を使用しているので、思う存分手の込んだ出力を作成することができます。実際、コマンド ウィンドウに見えるような Internet Explorer ウィンドウを作成することも可能です。これがかっこ良くないというなら、いったい何をかっこいいというのでしょうか (実際、ある Scripting Guy は息子によく次のように指摘されます。Scripting Guy ってかっこいいってことが何なのかわかってないね)。


関連情報

Hey, Scripting Guy! - アーカイブもチェックしてください。

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