お知らせ

  • シスキュー技術部

VBScriptでIE10を互換モードに変更する

noimage

VBScriptでIE10を互換モードに変更する

InternetExplore10を起動の際に互換モードで動作させるVBスクリプトを作成してみました。 InternetExplore10(IE10)はWindows8では標準、Windows7ではWindowsアップデートによってマイクロソフト社すすめる標準のブラウザになろうとしています。 しかし、かつてIE向けに対応されたWEBシステムなどで、互換性の問題が出てくる例もあるようです。 この互換性の問題を解決するために、IE10には開発者ツールを開いて、ドキュメントモードの変更を行うことで無事動作するという事例もありますが、このドキュメントモードの変更は、毎回ブラウザ起動のたびに手動で変更する必要があります。 この手動での変更をVBスクリプトを利用して、自動化してみます。 VBスクリプト例 ソースは下記の通りです。 ファイル名: LaunchIE10.vbs [vb] Option Explicit 'Define Dim WSHobj Dim waitie Dim quirkstype Dim siteurl Dim AryArgs 'Constant Const SEC=1000 Const DEFAULT_WAIT=3 Const DEVMODEkey="{F12}" Const TYPE5="%u" Const TYPE7="%7" Const TYPE8="%8" Const TYPE9="%9" Const STANDARD="%s" Const QUIRKS="%q" Const DEFAULT_URL="" Const IEPATH="""C:\Program Files\Internet Explorer\iexplore.exe""" 'Argument Check waitie=DEFAULT_WAIT siteurl=DEFAULT_URL quirkstype=TYPE5 If WScript.Arguments.Count <> 0 then Set aryArgs = WScript.Arguments If aryArgs.Count > 0 then siteurl=aryArgs(0) If aryArgs.Count > 1 then If IsNumeric(aryArgs(1)) = false Then waitie = DEFAULT_WAIT Else waitie = Cint(aryArgs(1)) End If End If If aryArgs.Count > 2 then Select Case aryArgs(2) Case "5" quirkstype = TYPE5 Case "7" quirkstype = TYPE7 Case "8" quirkstype = TYPE8 Case "9" quirkstype = TYPE9 Case "S" quirkstype = STANDARD Case "Q" quirkstype = QUIRKS Case Else quirkstype = TYPE5 End select End If End If Set WSHobj = WScript.CreateObject("WScript.Shell") 'run IE WSHobj.run IEPATH & " -new " & siteurl 'wait for IE Active WScript.sleep waitie*SEC WSHobj.Sendkeys DEVModeKey 'wait for DEVControl WScript.sleep waitie*SEC WSHobj.SendKeys quirkstype & DEVMODEkey [/vb] VBスクリプト解説 IE10で開発者モードに入るにはF12キーを押します。 そこから各互換性モードに入るためには、Altキーとバージョン番号の組み合わせになります。 最も古いブラウザとの互換性のためには、Internet Explorer 5 Quirksというモードが用意されていますが、これはAlt+Uの組み合わせになります。 このキーの組み合わせを、SendKeysというメソッドで擬似的にキー入力させています。 IE9標準モードであればAlt+9など、いくつかのバージョンが用意されていますが、上記VBスクリプトでは、Internet Explorer 5 Quirksというモードをデフォルトで選択するようになっています。 このスクリプトをそのまま実行すると、あたらしいIE10を立ち上げ、標準のホームページを開き、開発者モードに入ってInternet Explorer 5 Quirksにモードを変更して、開発者モードを終了します。 このSendkeysを使う都合で、IEが立ち上がるまで、立ち上がった後キー入力を受け付けるまでの二回、待ち時間を設けています。 標準では3秒みていますが、早いパソコンであれば、1秒ほどの待ち時間でも十分実行できます。この辺りはパソコンや、ページを開くまでの時間によって、適切な時間は変わってきます。 SendKeysはアクティブなウィンドウに対して、キー入力を送るメソッドですので、途中でIE10からフォーカスが移ってしまうと正常に動作しません。 このスクリプトでは積極的にフォーカスを取りに行っていないので、待ち時間中にフォーカスが移ってしまう場合は、改良する必要があるでしょう。 VBスクリプトに引数を与える方法 このVBスクリプトは三つの引数をとるように作成しています。 第一引数は、最初に開くwebサイトのURL。 第二引数は、待ち時間。単位は秒です。 第三引数は、互換モード。5であればInternet Explorer 5 Quirks、7であればInternet Explorer 7 標準という感じになっています。詳しくはスクリプトをご覧いただけるるとご理解いただけると思います。 このスクリプトファイルのショートカットを作り、プロパティのリンク先に、vbsファイル名に引き続くようにして半角スペースで区切りながら三つの引数を入力します。 上記スクリーンショットを例に挙げると、弊社コーポレートサイトを、3秒の待ち時間(合計6秒)を設けて開き、Quirksモードに変更する、というショートカットになります。 終わりに 本スクリプトは、動かないWebシステムをIE10で動作させるという保証はできません。 スクリプトでIE10の互換性モードを変更する、ということを実現するためのものです。 動作させる環境によって正常に動作しない場合や、スクリプト実行により何らかの損害を被った場合も一切の責任を負わないものとします。 スクリプトを精査したうえでのご利用をお願いいたします。 IE10で既存のWebシステムが正常に動作しないのは、さまざまな原因があり、システム側の問題、システムが利用しているライブラリの問題、IE10がこれまでのIEとの互換性よりも機能性をとった部分など、数えればいくらでもある可能性と、その組み合わせになっています。 単純にIE10の互換性モードを変更すれば動作するのであれば、このスクリプトもいくらか役に立つ場面もあるかもしれません。 Windows7でいつまでIE9がサポートされるのかはわかりませんが、Windows8では標準のブラウザでもあるので、IEのバージョンダウンだけでは解決できない時はやがてやってくるでしょう。 そのときシステムをIE10にむけて対応するのか、あるいはIE10が変化しているのか、他のブラウザで動作する場合は、他のブラウザを推奨するのか、対応として考えられることは様々ですが、一つの変わった解決策として参考にしていただければと思います。

  • シスキュー技術部

シャットダウンスクリプトの簡単な解説

noimage

シャットダウンスクリプトの簡単な解説

VBS(VBスクリプト)を書いたのは初めてですが、昔ながらのバッチファイルでは実現できなさそうだったので、VBスクリプトの学習の意味を込めて作成しました。 Windows8にシャットダウンのショートカットを作る 宣言部 [vb] Option Excplicit [/vb] この宣言は、あらかじめ変数を宣言しないと使えない、VBユーザーにはおなじみの宣言です。 タイプミスで変数名を間違えても、エラーが出てデバッグが楽になるので、宣言しておきます。 define部では変数の宣言をしています。 execParamは実行時のパラメータを受け取る配列。 intCounterは待機時間のカウンター rtnは戻り値の格納用 WSHobjはWSHオブジェクトのインスタンス用 Argsはpopup.vbsの実行用文字列 WaitCounterは待機秒数の格納用 flgForthは強制オプション用のフラグ(Forceの間違いですが、見逃してください) 定数DEFAULT_COUNTERはデフォルトの待機時間 定数MINIMUM_COUNTERは最短待機時間。 最短待機時間は、たとえば待機時間ゼロで、誤ってスタートアップフォルダに入れてしまった時などのために入れていますが、普通に使ってる限りは必要のない部分かもしれません。 即時シャットダウンがほしければ、shutdown.exeを呼び出すバッチファイルを作ればよいだけですので、差別化のようなものと考えてください。 引数チェック Argument Check & Set部では引数のセットなどを行っています。 [vb] WScript.Arguments.Count [/vb] で引数の数が取れます。 [vb] Set execParam = WScript.Arguments [/vb] で引数を配列に入れ、0からの配列の添え字で引数にアクセスできます。 多少込み入って見えますが、数値以外のものがセットされた時のためのもので、それほど複雑なことはしていません。 待機 Waiting loop部ではpopup.vbsを設定回数呼び出しています。 [vb] Set WSHobj = WScript.CreateObject("WScript.Shell") [/vb] でWindowsScriptShellのインスタンスを作成し、runメソッドでpopup.vbsを呼び出しています。 popup.vbsはここで設定された引数でポップアップウィンドウを呼び出すだけのスクリプトですが、毎回呼び出すことで、できる限りポップアップが前面に表示されるようにしています。 前面で操作できるところにポップアップがないと、キャンセルなどができなくなってしまいます。 なかぽんの雑記さんの記事を参考にさせていただきました。 vbsでWshShell popupを前面に表示する http://d.hatena.ne.jp/nakapon/20121120 popupは一秒待機して戻るように設定していますので、繰り返し呼び出すことにより、時間を設定できます。 popupのボタンが押された場合は、戻り値を受け取って、SELECT CASEで分岐させています。 戻り値1であれはOKボタンなので、シャットダウン用のプロシージャを呼び出します。 戻り値2であればキャンセルなので、終了処理をキャンセルするプロシージャを呼び出します。 戻り値がない場合は、何もしません。 設定回数ループが終わると、シャットダウン用のプロシージャを呼び出します。 シャットダウン用プロシージャ [vb] Set Wshshell = WScript.CreateObject("WScript.shell") [/vb] でオブジェクトWshshellにWScript.shellのインスタンスをセットします。 runメソッドでshutdown.exeを呼び出します。 強制フラグが1の場合は-fオプションを付きでshutdown.exeを呼び出します。 ここで使用しているオプションは -s シャットダウンを行う -t 待ち時間の設定、0であれば即時 -f 強制的に終了する です。 shutdown.exeにはほかにもオプションがありますので、runメソッドの中身を書き換えれば、再起動やさまざまなカスタマイズが可能になります。 キャンセル用プロシージャ [vb] WScript.Quit [/vb] これでスクリプト自体の終了を行います。 VBでいえばEndやExitの代わりです。

  • パソコン関連

Windows8にシャットダウンのショートカットを作る

noimage

Windows8にシャットダウンのショートカットを作る

Windowsにカウントダウン式のシャットダウンを行うスクリプトを作ってみます。 Windows8でなくとも、WindowsXPやWindows7でも実行できます。 Windows8のシャットダウンはタッチパネルでない場合、マウスを右端上下のホットコーナーに合わせて、チャームを出し、設定からシャットダウンを選ぶ、という手順が必要です。 Shutdown.exe WindowsにはXPのころからshutdown.exeという実行ファイルがあり、これを直接実行することで、シャットダウンを行うことができました。 コマンドプロンプトを立ち上げて以下を入力すると、30秒後にシャットダウンに入ります。(保存していない書類があるときは実行しないでください) [text] shutdown.exe -s -t 30 [/text] この三十秒の間に、シャットダウンを中止するには [text] shutdown.exe –a [/text] で中止することができます。 しかし、シャットダウンのためにコマンドプロンプトからコマンドを入力するのは、むしろ手間がかかるので、実際に実行する人はいないと思います。 筆者の理想としては、Macのシステム終了のように、終了を実行してから、自動的にカウントダウンが始まり、その間に即時終了とキャンセルのできるものです。カウントダウンが終わると、自動的にシステムが終了します。 これにできるだけ近いスクリプトを作って、ショートカットから実行できるようにしてみたいと思います。 スクリプト実例 ファイル名: shutdown.vbs [vb] Option Explicit 'define Dim execParam Dim intCounter Dim rtn Dim WSHobj Dim Args Dim WaitCounter Dim flgForth Const DEFAULT_COUNTER = 30 Const MINIMUM_COUNTER = 10 flgForth = 0 'Argument Check and Set If WScript.Arguments.Count = 0 then WaitCounter = DEFAULT_COUNTER Else Set execParam = WScript.Arguments If IsNumeric(execParam(0)) = false Then WaitCounter = DEFAULT_COUNTER Else WaitCounter = Cint(execParam(0)) End If If WScript.Arguments.Count = 2 Then If execParam(1)="f" Then flgForth = 1 End If End If If WaitCounter <= MINIMUM_COUNTER Then WaitCounter = MINIMUM_COUNTER 'Waiting loop For intCounter = WaitCounter to 1 step -1 Set WSHobj = WScript.CreateObject("WScript.Shell") Args = "cscript ""popup.vbs""" _ & " """ & CStr(intCounter) & "秒後にシャットダウンします" & Chr(13) & Chr(10) & "OKですぐにシャットダウンします""" _ & " 1" _ & " ""シャットダウン""" _ & " 1" rtn = WSHObj.Run (Args,0,true) Select Case Rtn Case 1 call procShutdown Case 2 call procAbort Case Else ' End Select Next Call procShutdown Wscript.Quit 'shutdown Procedure Sub procShutdown Dim Wshshell Set Wshshell = WScript.CreateObject("WScript.shell") If flgForth=1 then Wshshell.run("shutdown.exe -s -f -t 0") Else Wshshell.run("shutdown.exe -s -t 0") End If WScript.Quit End Sub 'abort Procedure Sub procAbort WScript.Quit End Sub [/vb] ファイル名: popup.vbs [vb] Option Explicit Dim Arg Dim rtn Dim WSHObj Set WSHObj = WScript.CreateObject("WScript.Shell") Set Arg = WScript.Arguments rtn = WSHObj.Popup(Arg(0),Arg(1),Arg(2),Arg(3)) if rtn=1 or rtn = 2 then WScript.Quit(rtn) Set WSHobj = Nothing [/vb] 使い方 この2つのスクリプトをそれぞれ、vbsファイルとして保存します。 それらを一つのフォルダに格納し、起動する際はshutdown.vbsをダブルクリックします。 カウントダウンが始まります。OKを押せば即時終了。キャンセルを押すと終了をキャンセルできます。 カウントダウンがおわると、自動的にシャットダウンします。 ショートカットのつくり方 shutdown.vbsを右クリックし、ショートカットの作成を選択します。 作成されたショートカットのプロパティを開きます。 ここで「アイコンの変更」を選択し、電源ボタンに変えてみます。 このアイコンを設定して、デスクトップにコピーすれば、いつでもショートカットからアクセスできます。 オプション このオプションは指定しなくとも、利用することができます。 vbsファイルの後に半角スペースを一つ開けて、数値を入力すると、カウントダウン秒数を変更できます。 最低限の猶予のために10秒以下は設定できなくなっています。 カウントダウン秒数の次に、スペースを一つ開けて、fと入力すると、アプリケーションの応答を待たず、強制的にシャットダウンします。 保存していないファイルも警告なしにシャットダウンし、失われてしまいます。 あまりお勧めのオプションでないので、よく理解していただいたうえでお使いください。