好吧,这让我难以置信。我有一个程序要安装在不同的机器上,它应该在完成特定任务后执行批处理文件。批处理文件由用户通过我们的 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 的同一台计算机),当它进入调用此函数的整个过程中的步骤时,它实际上并没有启动批处理文件。请记住,它永远不会在任何一方引发异常。它也不会向该字符串返回退出代码,因为我还有其他日志记录来跟踪它。
在这种情况下,我只能想到两种可能性。A:) 存在权限问题,不允许应用程序在安装它的计算机上启动批处理文件,或者 B:) 此子程序由从主线程分离的线程调用(即使用MyThread = New System.Threading.Thread(AddressOf TheMainLoop) MyThread.Start()
命令)。
尽管如此,它在 IDE 的编译和运行阶段 100% 的时间都可以工作,但在安装之后却没有,这让我大吃一惊。
编辑1: 刚刚做了一个测试,我在主窗体本身上放置了一个按钮,点击事件与前面的函数做同样的事情,它工作,即使在安装之后。这让我相信它只有在使用主线程启动时才会起作用……你们觉得呢?
编辑 2: 批处理文件是一个非常简单的测试批处理,它打开一个文本文件,我知道批处理文件和路径都很好,因为编译时它工作正常。此外,编辑 1 声明我创建了一个简单的按钮,从上面执行相同的代码,安装后它工作正常。由于这是在主线程上完成的,并且之前的代码是在从原始线程中分离出来的单独线程中完成的,我想知道这是否是问题的原因。另一个疯狂的事情是,如果文件启动与否,我的日志记录会捕获,当我遇到原始问题时,它几乎就像它正在启动一样。呸,这整件事简直是疯了。
编辑3: 添加了答案。