さて、これは私が信じられないほど困惑したものです。特定のタスクを完了した後にバッチ ファイルを実行することになっている別のマシンにインストールするプログラムがあります。バッチ ファイルはユーザーが Web サービスを介して構成し、アプリケーションはこのパス文字列を取得して、そのパスでファイルを実行します。かなりシンプルでわかりやすいはずですよね?
コード:
Private Function ExecuteBatchFile(batchFilePath As String) As String
Try
Dim psi As New ProcessStartInfo(batchFilePath)
psi.RedirectStandardError = True
psi.RedirectStandardOutput = True
psi.CreateNoWindow = False
psi.UseShellExecute = False
Dim process As Process = process.Start(psi)
process.WaitForExit()
ExecuteBatchFile = process.ExitCode
Catch ex As Exception
StrAppStatus = "Error within execution of batch file: " & ex.Message
LogMe(StrAppStatus)
Return "Fail"
End Try
End Function
さて、トリッキーな部分です。このコードは、開発環境で実行すると完全に機能します。私はまだ問題を抱えていません。ただし、アプリケーションが任意のコンピューター (IDE がインストールされているコンピューターを含む) にインストールされている場合、この関数を呼び出す全体的なプロセスのステップに到達すると、実際にはバッチ ファイルが起動されません。どちらの側でも例外がスローされることはありません。また、それを追跡するための他のログがあるため、その文字列に終了コードを返しません。
この場合、私が考えることができる可能性は2つだけです。A:) アプリケーションがインストールされているコンピュータ上でバッチ ファイルを起動することが許可されていないパーミッションの問題があるか、B:) このサブルーチンがメイン スレッドからスピンオフされたスレッドによって呼び出されます (つまり、MyThread = New System.Threading.Thread(AddressOf TheMainLoop) MyThread.Start()
指図)。
それでも、IDE でのコンパイルおよび実行段階では 100% 動作するが、インストール後には動作しないという事実は私の心を吹き飛ばしています。
編集1: メインフォーム自体にボタンを配置したテストを行ったところ、クリックイベントは以前の機能と同じことを行い、インストール後でも機能します。これは、メインスレッドを使用して起動された場合にのみ機能すると私に信じさせます... 皆さんはどう思いますか?
編集 2: バッチ ファイルは、テキスト ファイルを開く非常に単純なテスト バッチです。コンパイルすると正常に動作するため、バッチ ファイルとパスの両方が正常であることはわかっています。また、編集 1 は、上記と同じコードを実行する単純なボタンを作成したことを示しており、インストール後に正常に動作します。それはメイン スレッドで実行され、以前のコードは元のスレッドから分離された別のスレッドで実行されたので、それが問題の原因ではないかと考えていました。もう1つのクレイジーなことは、ファイルが起動するかどうかをログに記録し、元の問題が発生したときに起動しているかのように動作することです。ああ、このすべてはただのナッツです。
編集3: 答えを追加しました。