広告

2014年7月16日水曜日

VBScriptフリーズ時にまず確認すべきポイント

VBScriptで記述したバッチ処理がフリーズするトラブルが発生することがあります。この際にまず確認すべきポイントを紹介したいと思います。


■WScript.ShellのExecメソッド標準出力バッファ4KBの罠


もしフリーズが発生するVBScript処理内に


Set WSHShell = CreateObject("WScript.Shell")
Set oExec = WSHShell.Exec("cscript scriptworker.vbs")

こんな感じで、Execメソッドを使っていれば、まず間違いなく標準出力(あるいはエラー出力)のバッファあふれによるフリーズの可能性大です。

Execメソッドでの標準出力及びエラー出力のバッファサイズが4KBのため、大量に処理結果が出力されるとバッファが一杯になり処理がブロックされてしまいます。

■解決策


マイクロソフトのサイトにあるとおり、

Hang When Reading StdErr/StdOut Properties of WshScriptExec Object








StdOut及びStdErrプロパティから標準出力結果を適宜読み出してあげればOKです。


■デッドロックが発生する可能性もあり


以下のブログ
へたれたプログラマの憂鬱 WSHのExecメソッド

によると、StdOut及びStdErrプロパティから標準出力結果を適宜読み出すだけでは、場合によってはデッドロックを引き起こす可能性もあるとのこと。

現場ではそのようなケースに遭遇したことはないですが、運悪くそのケースにハマった場合は標準出力をリダイレクトしてファイルに吐き出す等の対応が必要になります。



Ads by 忍者AdMax