Silverlight をインストールするには、ここをクリックします*
Japan変更|すべてのMicrosoft のサイト
Microsoft TechNet*
マイクロソフト サイトの検索:
|TechCenter|ダウンロード|TechNet プログラム|サブスクリプション|My TechNet|セキュリティ情報|TechNet アーカイブ|サイトマップ
サイトの検索


Hey, Scripting Guy!

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

Hey, Scripting Guy!

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

詳細情報

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

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

Hey, Scripting Guy! ダウンロード

Spacer

*

非表示のウィンドウでスクリプトを開始する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。非表示のウィンドウでスクリプトを開始する方法はありますか。

-- OT

SpacerHey, Scripting Guy! AnswerScript Center

OT さん、こんにちは。今日は Scripting Guys にとって (少なくともこのコラムを執筆している Scripting Guy にとって) は、やや残念な日です。昨日お話したように、シアトル地域は、"パイナップル エクスプレス" と呼ばれる激しい暴風雨に見舞われました。この雨によって、地域の 1 日の総雨量最高記録が更新されることは間違いないように思われました。しかし残念なことに、記録の更新には遠く及びませんでした。公式の記録では 24 時間の降水量は 95.75 mm で、127 mm 強という記録には程遠いものでした。正直なところ、このコラムを執筆している Scripting Guy は、雨など少しも降ってほしくないと思っていました。とは言うものの、大雨を避けられないのであれば、思い切って記録を打ち立てるくら降ってくれた方がましです。ところが、結果は次のとおりです。

「Scripting Guy さん、この前大雨で大変だったらしいですね。」

「そうなんです、95.75 mm も降りました。」

「うわっ、それは最高総雨量記録を塗り替えたに違いないですね。」

「いえ、実は、そんなことはないんです。残念ながら、記録からは程遠いものだったんです。」

「そうですか。じゃあ、ちょっと、ブレマートンから来たあの彼と話してきます。ブレマートンではその同じ日に 273.81 mm の降水量を記録したらしいですよ。それこそまさに雨ですね。」

シアトルでの人生はそういうものです。このあたりでは、何をするにも "ほぼ" が精いっぱいなように思われます。たとえば、すべての交通問題を解決する計画は "ほぼ" 実現できるところまで来ています。2010 年には、投票による採択から 14 年の歳月 (および数十億円の投資) をかけて開発したシアトルの中心部と空港とを結ぶ路面電車が完成する予定です (厳密には、"ほぼ" 空港までです)。シアトルには、プロのバスケットボール チームが "かろうじて" あります。何らかの奇跡が起きない限り、ソニックスはオクラホマ シティに移転します (オクラホマ シティの住民がそのために何をしたかはわかりませんが、彼らの気が変わったら困るので、私たちは何も言いません)。そして、もちろん、1 日の最高降水量に "ほぼ" 達しました。

できそうだと思ったのですが、結局のところできませんでした。

ブレマートン在住の読者への注 : 皆さんが 273.81 mm の記録を誇りに思っていることは知っています。不正をせずに私たちを打ち負かしたのですから、それも当然でしょう。ただ、うぬぼれないでください。何しろ、かつてミズーリ州ホルトでは、ほんの 42 分間という短時間で 304.8 mm の降水量を記録しました。この記録を破ったらご連絡ください。その時には、私たちも感心すると思います。

とにかく、水分が抜けてきた (いえ、正確には "ほぼ" 抜けてきた) ので、別のことに専念できます。たとえば、非表示のウィンドウでスクリプトを開始する方法です。

では、非表示のウィンドウでスクリプトを開始するにはどうすればいいのでしょうか。実は、これを行う方法はいくつか存在します。たとえば、単純に次のようなスクリプトを記述することができます。

Set objShell = CreateObject("Wscript.Shell") 
objShell.Run "Wscript.exe C:\Scripts\Test.vbs"

このスクリプトは "たいてい" 機能します。その理由は、Wscript スクリプト ホストではコマンド ウィンドウが使用されないという単純なものです。このため、スクリプトを Wscript スクリプト ホストで実行しても、画面上には何も表示されません。ただし、スクリプトによって情報がエコー バックされなければの話です。情報がエコー バックされる場合には、Wscript.Echo コマンドが呼び出されるたびにメッセージ ボックスが表示されます。しかし、画面上にメッセージ ボックスや入力ボックスを表示させるスクリプトでない限り、単純にスクリプトを Wscript スクリプト ホストで実行して、そのスクリプトを表示することなく実行できます。

では、もしそれがすべて本当であれば (実際に本当ですが)、なぜ上記のスクリプトを提示して、今日のコラムを終わりにしなかったのでしょうか。そうすることもできましたが、Scripting Guys は常に、複数のシナリオで使用できるスクリプトを探しています。上記のスクリプトは、.VBS スクリプトで正しく動作しますが、.VBS スクリプトでしか動作しません (確かにそのとおりです。たとえば、コマンド ライン ツールを Windows スクリプト ホストのいずれかで実行することはできません)。

そこで、別の方法を使用して、ほぼ何でも非表示のウィンドウで実行できるようにすることにしました。その方法は次のようになります。

Const HIDDEN_WINDOW = 0 
 
strComputer = "." 
 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
 
Set objStartup = objWMIService.Get("Win32_ProcessStartup") 
Set objConfig = objStartup.SpawnInstance_ 
objConfig.ShowWindow = HIDDEN_WINDOW 
 
Set objProcess = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process") 
 
objProcess.Create "Cscript.exe C:\Scripts\Test.vbs", null, objConfig, intProcessID

ここではどのような処理が行われているのか、ですって。良い質問ですね。ご覧のとおり、まず HIDDEN_WINDOW という名前の定数を定義し、値を 0 に設定します。ご想像のとおり、この定数を使用して、2 番目のスクリプト (またはコマンド ライン ツール) を非表示のウィンドウで開始することをスクリプトに指示します。定数を定義したら、ローカル コンピュータの WMI サービスに接続します。

何ですって。このスクリプトはリモート コンピュータに対して実行することができるか、ですって。はい、できますが、適切ではありません。というのも、スクリプトをリモート コンピュータで実行する場合には、(これから説明する) すべてのスタートアップ オプションの構成を行う必要がないためです。というのも、リモート コンピュータで開始されたプロセスは常に非表示のウィンドウで実行されますから。ただ、もちろん、このスクリプトをそのままリモート コンピュータで実行することはできます。それに必要な作業は、そのリモート コンピュータの名前を strComputer 変数に代入するだけです。

strComputer = "atl-fs-001"

WMI サービスに接続したら、次のコード ブロックを実行します。

Set objStartup = objWMIService.Get("Win32_ProcessStartup") 
Set objConfig = objStartup.SpawnInstance_ 
objConfig.ShowWindow = HIDDEN_WINDOW

ご想像のとおり、これはスタートアップ オプションを構成するスクリプトの一部です。スタートアップ オプションを構成するには、まず、Win32_ProcessStartup クラスへのオブジェクト参照を作成します。これは・・・。ええ、確かにこれは、プロセスのスタートアップ オプションを構成するためのクラスです。Win32_ProcessStartup クラスに接続したら、SpawnInstance_ メソッドを呼び出します (メソッド名の最後にアンダースコアがあることに注意してください)。これで "空の" スタートアップ オブジェクトを取得して、必要に応じて構成できます。このスクリプトに関して必要なのは、(HIDDEN_WINDOW 定数を使用して) ShowWindow プロパティの値を 0 に設定することだけです。

objConfig.ShowWindow = HIDDEN_WINDOW

この設定によってどうなるのでしょうか。お察しのとおり、これによって、スクリプト (またはコマンド ライン ツール) が非表示のウィンドウで開始されます。

ところで、Win32_ProcessStartup クラスを使用すると、他にもさまざまな操作を実行できます。たとえば、プロセスを、最小化または最大化されたウィンドウで開始したり、通常よりも高い (または低い) 優先度で開始したりすることができます。詳細については、MSDN サイトの WMI SDK (英語) を参照してください。ご参考までに、コマンド ウィンドウで実行するスクリプトまたはアプリケーションを構成するコードを次に示します。この場合、コマンド ウィンドウの状態は次のようになります。

ウィンドウ タイトルは Test Window です。

背景色は明るい赤色です。

画面の左上隅に配置されます。

コードは次のとおりです。

Set objStartup = objWMIService.Get("Win32_ProcessStartup") 
Set objConfig = objStartup.SpawnInstance_ 
objConfig.Title = "Test Window" 
objConfig.FillAttribute = 192  
objConfig.X = 0 
objConfig.Y = 0

繰り返しになりますが、詳細については WMI SDK を参照してください。

今回説明しているスクリプトでは、スタートアップ オプションを構成したら、次のコード行を使用して、Win32_Process クラスにバインドします。

Set objProcess = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")

その後、Create メソッドを呼び出して、スクリプト (またはコマンド ライン ツール) を非表示のウィンドウで実際に実行します。

objProcess.Create "Cscript.exe C:\Scripts\Test.vbs", null, objConfig, intProcessID

ご覧のとおり、Create メソッドには次の 4 つのパラメータを渡す必要があります。

Cscript.exe C:\Scripts\Test.vbs: 実行する .VBS スクリプトの完全なパスです。パスの前に Cscript.exe を追加することで、スクリプトは CScript スクリプト ホストで実行されます。これは、ここでの処理として適切です。というのも、これで Wscript.Echo コマンドが単純に非表示のコンソール ウィンドウにエコー バックされるからです。Test.vbs を Wscript スクリプト ホストで実行すると、コマンドはメッセージ ボックスの形式で画面にエコー バックされます。これはすばらしいことですが、1 つだけ問題があります。それは、これらのメッセージ ボックスが非表示のウィンドウで出現し、表示を確認できないということです。つまり、これらのメッセージ ボックスは、だれかがクリックするまで永遠に (そして無駄に) そこで待機します。また、メッセージ ボックスがクリックされるまで、スクリプトもただ永遠とそこで待機します。

Null: スクリプトまたはコマンド ライン ツールの作業ディレクトリを指定します。(この場合のように) Null に設定すると、単純に Test.vbs を、それを開始したスクリプトと同じディレクトリで実行することになります。

objConfig: スタートアップ オプション オブジェクトへのオブジェクト参照です。

intProcessID: 新しいプロセスに割り当てられた PID (プロセス ID) を保持する出力パラメータです。ここでは変数名を指定するだけです。変数名を指定すると Create メソッドによって、変数が自動的に作成されます。

これで作業は完了です。このスクリプトを開始すると Test.vbs が実行されますが、それは非表示のウィンドウで実行され、だれにも気付かれることはありません。ではまた明日。

やっぱり、ちょっと待ってください。もう少し降水量の統計データを提供しないとしっくりしません。どのような統計か、ですって。これはどうでしょう。1956 年 7 月 4 日メリーランド州ユニオンビルでは、1 分間に 31.24 mm の降水量を記録しました (どれほど多くの人が「1 分ほど外に出るだけなので、すぐ戻ります」と言って、この豪雨に見舞われたことでしょう)。また、1979 年テキサス州アルビンでは、24 時間で 1066.8 mm の降水量を記録しました。信じられないかもしれませんが、その程度ではたいしたことはありません。1966 年には、レユニオンという小さな島で 1 日で 1828.8 mm の降水量を記録しました。きっとすばらしい日だったに違いありませんね。

: もし皆さんが「レユニオンとは、バカンスを過ごすのに良さそうな場所だな」とお考えなら、次の点を考慮してください。1980 年、レユニオンでは 12 時間で 1168.4 mm の降水量を記録しました。それも、3962.4 mm を記録した 5 日間にわたる降雨の一部です (1 日あたり 787.4 mm 以上の降水量があったということです)。

ですが、確かに、バカンスを過ごすには良さそうな場所ですよね。

最後に忘れてはならないのは、インドのチェラプンジです。編集者が高校を卒業した年と同じ 1860 年には、チェラプンジで総計 26,466.8 mm (約 26 m) の降水量を記録しました。つまり、1 年間にわたって 1 日あたり平均約 76 mm の降雨があったことになります。ブレマートンには頑張ってこの記録を破ってもらいたいと思います。


 

Microsoft