0

好吧,这让我难以置信。我有一个程序要安装在不同的机器上,它应该在完成特定任务后执行批处理文件。批处理文件由用户通过我们的 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: 添加了答案。

4

1 回答 1

0

感谢 tinstaafl,答案是将 UseShellExecute 更改为 True。我不得不删除 RedirectStandardError 和 RedirectStandardOutput 行,但无论如何我都没有使用它们。关于这一点,感谢大家的调查,如果有人知道为什么会发生这种情况,我会全力以赴。

于 2013-07-11T22:12:48.017 回答