作業時に、各ユーザのMy Documents内に設置された特定の作業フォルダへバッチファイルを書き出した後、Shellで実行するプログラムがあります。
それが昨日までは動いていたのに、今日になって動かないという現象が発生しています。
動かない場所は、Shellの実行箇所で、ファイルが存在しないことによる例外です。
事前に以下のようにファイルが存在することを確認してから実行しても、if文を乗り越えて例外を発生させるので困っております。
Dim fsyObject As Object = CreateObject("Scripting.FileSystemObject")
If fsyObject.FileExists(strBatFull) Then
intResult = Shell(strBatFull, vbHide, True)
End If
XPでは、この症状は発生しません。Windows7でも発生するPCと発生しないPCが存在します(例によってVBがインストールされていないPCで発生しますorz)。
よろしくお願い致します。
Shell関数において、FileNotFoundExceptionが発生するのは「ファイルが存在しない」という理由だけにとどまりません。様々な理由(例えば、ファイルのアクセス権限エラー、依存するDLLが見つからない、等)で、ファイルが存在してもプログラムが起動できない場合は、FileNotFoundExceptionにマップされてしまいます。
まずはFileNotFoundExceptionの詳細を調べるべきかと。
FileNotFoundException メンバ (System.IO)
FileNotFoundException.MessageやFileNotFoundException.InnerExceptionはどうでしょう?特にInnerExceptionにはファイルが存在しない以外の原因となった要因となるExceptionが入っている可能性があります。
また、エクスプローラ上や、コマンドラインから直接そのプログラム(Shellで起動しようとした)を起動しようとした場合、正しく起動できるのでしょうか?
ardarimさんありがとうございます。
Shell実行前にMSGBOXを入れて、strBatFullの内容をコピペし
コマンドラインから手作業で実行させた場合は動作しました。
このままShellにこだわっていても仕方が無さそうだったので、代わりとして
Dim sdpProcess As System.Diagnostics.Process = New Process()
sdpProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
sdpProcess.StartInfo.FileName = strBatFull
sdpProcess.Start()
sdpProcess.WaitForExit()
sdpProcess.Close()
sdpProcess.Dispose()
としてみましたところ、こちらは正しく起動しました。
発生原因がよくわからないのが不気味に感じています。
しかし、とりあえずSystem.Diagnostics.Processで様子を見ようと考えています。