« スクリプトを使わずに、関連付けで、Excelファイルをコマンドラインで印刷する。 | トップページ | VBSファイルをCMDファイルにする。 »

2007年12月 7日 (金)

関連付けは非同期実行なので、連続処理に向かない。(その2)

具体的にどういう問題が起こるかの再現テストです。

Hey, Scripting Guy!に、こんな記事があります。
スクリプトを使用してテキスト ファイルを印刷することはできますか?

そこのサンプルコードは、こうです。

TargetFolder = "C:\Logs"
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(TargetFolder)
Set colItems = objFolder.Items
For Each objItem in colItems
    objItem.InvokeVerbEx("Print")
Next

テキストファイルでは、一度にたくさんのメモ帳が立ち上がるくらいで、あまり問題ないでしょう。

ExcelファイルやPDFファイルならどうか? 試してみてください。

ExcelやAdobe Readerが起動されてない状態で、スクリプトを起動すると、何も起きないか、ExcelやAdobe Readerが起動されるだけで、印刷されなかったりします。

これは、関連付けの非同期処理を待たないで、先にプロセスが終了するからです。

次に、コードの最後に、
MsgBox "Wait!"
を入れて、ExcelやAdobe Readerが起動されてない状態で、起動します。
すると、ファイルの一つは、印刷されますが、残りのファイルは、印刷されたり、されなかったりします。
また、普通はひとつ起動されて終了するはずのExcelがたくさん起動されたり終了しないで残ったりします。
Adobe Readerは仕様でひとつ終了しないで残ります。

次に、ExcelやAdobe Readerが起動されている状態で、起動します。
この場合は、問題なく印刷されます。印刷順序が変わったりしますが。

今度は、サンプルコードの
For Each objItem in colItems
    objItem.InvokeVerbEx("Print")
Next

colItems.InvokeVerbEx("Print")
に変えて、ExcelやAdobe Readerが起動されてない状態で、起動します。
この場合も、問題なく印刷されます。印刷順序は変わりません。
これは、エクスプローラで複数選択してコンテキストメニューで印刷した場合に相当します。

そこで、正しいアプローチですが、例えば、テキストファイルでは、
notepad.exe /p テキストファイル
をひとつずつ同期実行すればよいのです。

ExcelやAdobe Readerの場合は、簡単にコマンドラインで印刷という訳には行きませんが、考え方は同じです。

« スクリプトを使わずに、関連付けで、Excelファイルをコマンドラインで印刷する。 | トップページ | VBSファイルをCMDファイルにする。 »