shellでDOSコマンドやexeなどを隠して実行する
  (C) 2001 A c t o r .N e t Soft Ware



 以下に公開するソースなどの著作は 篠田直樹 に復帰します。
原則として無許可で使用する事が出来ますが、ここに書かれている内容を
直リンクや引用などであたかも第三者が作成した様に見せたり如何なる事情でも金銭が発生する行為を禁止します。



 shell( path , option)

shellの使い方はこの様に使います。
実行が出来なかった場合、shell() は0の正数値を返します。
実行結果のチェックをしない場合、callを使います。

helpにも書いてありますが、shellに渡すpathには””を加える必要があります。
例えば、D:\test.bat なら shell( "D:\test.bat" , vbHide ) 変数を使う場合、「 """" & Str_temp & """" 」とします。
""が無くてもエラーは起きませんが、スペースなどの入ったディレクトリ配下で
プログラムを実行すると、shellコマンドがスキップされて結果としてバグを作る原因になってしまいます。
(恥ずかしながら、RACの VerUp で私はこれで悩んだ経験をしています。)
オプションが無い場合、ノーマルと判断してbatファイルを実行するとDOSプロンプトが出ます。
DOSプロンプト画面を隠す場合は、vbHide をオプションにします。

この他、shellで実行する時にDOSのオプションコマンドを入れたいと思う事が
あるかもしれませんが、shellにはファイルを実行するだけでコマンドを追加してもエラースキップします。

以下はtest.bat の実行している内容を aaa.txt に書き残す為のコマンドですが、
これをそのまま実行してもNGになります。

Shell("D:\test.bat >> C:\aaa.txt")

以下の方法を使います。(win98 のみ)
Shell("Command.com /c " & "D:\test.bat >> C:\aaa.txt" , vbHide )
( /c はプロンプトを自動終了させる為、vbHid はプロンプトを非表示にする為。)


上記の例で行くとファイルオプションなどを利用して、batファイルの中身を引いた上で
&を使って「 >> C:\aaa.txt 」を追記するか又は実行ファイルがexeの場合はbatファイルを作成した上で
パスとオプションコマンドを書き込みます。

注意点として、Print #intFileNo, で書き込む場合は一行で書く必要があります。
Print #intFileNo, を使って二行に跨いで書くとretrun コードが付加される為に
二行目からのコマンドが無効になります。

Win9x系の場合:
batファイルをshellで実行する時、vbHide を使うとWinoldapという要らないプロセスが生成されます。
これはbatファイルの実行処理が終了したのかOSが認識出来ない為に起こる現象です。
オプションを削除するとWinoldapは出なくなりますが、要らないDOS窓が現れます。
いちいちbatを作成しないで、shell から Command.com を使って直接、実行してみて下さい。

WinNt系の場合
Command.com を使うとコマンドが受け付けません。
batファイルを生成してshellで実行させると旨く行く様です。
Command.com が使えない現象は何が原因なのかは不明です。

--- 余談:----------------------------------------------------------------
事情によりファイルコピーなどを行なう必要のあるソフトでは、
tempファイルを作ってファイルやディレクトリを一括削除したい場合があります。
普通に考えると、APIで一括削除出来るコマンドが公開されていない為、
このディレクトリ配下を全て調べてファイルとディレクトリの削除関数を交互に
ちまちま実行していく必要があります。
これを確実に解決させるには、ルートなりに独自のワークディレクトリを
作成しておき、ここにコピーしたファイルをDOSコマンドで一括削除します。

WinNt系
rmdir /s /q 削除するパスの宛先

Win9x系
Command.com /c deltree /y 削除するパスの宛先

S は指定したディレクトリ配下を丸ごと削除する為のスイッチ。
q は削除する時に毎回、消して良いかの問い合わせを無効にするスイッチです。
こうする事で、楽で確実に削除を行なう事ができます。
batファイル生成でこれを書き込んで実行させると、あたかもプログラムで
きちんと削除した様に見せかける事が出来るというちょっとした裏技です。
(そんな事では技術者魂が足りん!とかのツッコミはナッシングです。)



Copyright (C) 2001 A c t o r .N e t Soft Ware All Right Reserved