Windows7における、VB2008.NETで質問です。

作業時に、各ユーザの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)。
よろしくお願い致します。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/11/05 23:33:41
  • 終了:2010/11/06 18:12:28

回答(1件)

id:ardarim No.1

ardarim回答回数892ベストアンサー獲得回数1422010/11/06 17:41:12

ポイント60pt

Shell関数において、FileNotFoundExceptionが発生するのは「ファイルが存在しない」という理由だけにとどまりません。様々な理由(例えば、ファイルのアクセス権限エラー、依存するDLLが見つからない、等)で、ファイルが存在してもプログラムが起動できない場合は、FileNotFoundExceptionにマップされてしまいます。


まずはFileNotFoundExceptionの詳細を調べるべきかと。

FileNotFoundException メンバ (System.IO)

FileNotFoundException.MessageやFileNotFoundException.InnerExceptionはどうでしょう?特にInnerExceptionにはファイルが存在しない以外の原因となった要因となるExceptionが入っている可能性があります。


また、エクスプローラ上や、コマンドラインから直接そのプログラム(Shellで起動しようとした)を起動しようとした場合、正しく起動できるのでしょうか?

id:halohalolin

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で様子を見ようと考えています。

2010/11/06 18:10:00
  • id:halohalolin
    なお、Windows7で例外が発生するPCと発生しないPCで、今のところ分かっている差は

    1.VBがインストールされていないPCでは、例外が発生します。
    2.例外が発生しないPCのユーザーフォルダは、C:\Users\...となっていますが
     例外が発生するPCのユーザーフォルダは、C:\ユーザー\...となっています。
     ただ、エクスプローラで、C:\ユーザー\に入っている際に、アドレス欄をクリックするとC:\Users\...と切り替わるので、関係ないかもしれません。
  • id:rsc96074
    私も、シェルやProcessを使うとき、フォルダ名やファイル名にカタカナが入るとエラーになります。(^_^;
  • id:halohalolin
    rsc96074さん、返答ありがとうございます。
     
    ダミーで c:\temp フォルダを作成し、その中でShellのテストを行った際はエラーが発生しなかったので、ご指摘の通りカタカナも関係しているのかも。
     
    ・・・ということで、次に、Shell実行直前に、実行するバッチファイル名を管理する変数の中身をMSGBOXで開く処理を入れてみました。
    すると、変数内にはカタカナが含まれていなかった(つまりC:\Users\...として扱われていた)のにもかかわらず、相変わらず同じ例外が発生し続けるため、よく分からないところです。
  • id:ardarim
    原因がわからないのは残念ですがお急ぎであれば動くことを優先せざるを得ないこともありますよね...

    ShellではだめでSystem.Diagnostics.Processならokというのも一つの手がかりではありますね。
    Process.StartInfo.UseShellExecuteは既定ではtrueで、trueの場合はシェル経由で実行されるため、「コマンドラインから手作業で実行させた場合は動作しました」という事実とは矛盾がないように思います。
    http://msdn.microsoft.com/ja-jp/library/system.diagnostics.processstartinfo.useshellexecute(VS.80).aspx

    ProcessStartInfo.UseShellExecute=falseにしたらだめかもしれません。
  • id:halohalolin
    ardarimさんありがとうございます。

    ProcessStartInfo.UseShellExecute=falseについて、また時間のあるときに試してみます。
  • id:cx20
    原因を調査する方法として Process Monitor を使ってみてはいかがでしょうか?

    ■ Process Monitor v2.92
    http://technet.microsoft.com/ja-jp/sysinternals/bb896645.aspx

    事象が発生する PC と発生しない PC で、それぞれ Process Monitor を実行してみて、結果を比較したら相違点が見つかるかもしれません。
  • id:halohalolin
    cx20さんありがとうございます。
     
    Process Monitor、次回バグ発生時に、是非参考とさせていただきます!
  • id:rsc96074
    ありがとうございました。m(_ _)m

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません