安装后VB.NET启动批处理文件无法正常工作

时间:2013-07-11 04:36:33

标签: vb.net multithreading winforms batch-file permissions

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

现在,对于棘手的部分。在dev环境中运行时,此代码非常有效。我还没有问题。但是,当应用程序安装在任何计算机上时(包括安装IDE的同一台计算机),当它进入调用此函数的整个过程中的步骤时,它实际上不会启动批处理文件。请记住,任何一方都不会抛出异常。它也不会将exitcode返回到该字符串,因为我还有其他日志记录来跟踪它。

在这种情况下我只能想到两种可能性。要么A :)存在权限问题,其中不允许应用程序在其安装的计算机上启动批处理文件,或者B :)此子程序由从主线程分离出来的线程调用(即使用MyThread = New System.Threading.Thread(AddressOf TheMainLoop) MyThread.Start()命令)。

仍然是它在IDE的编译和运行阶段100%的时间工作,但在安装之后不会让我大吃一惊。

编辑1: 刚做了一个测试,我在主窗体上放了一个按钮,click事件与早期的功能完全相同,即使在安装之后也能正常工作。这让我相信它只有在使用主线程启动时才能工作......你们都有什么想法?

编辑2: 批处理文件是一个非常简单的测试批处理,它打开一个文本文件,我知道批处理文件和路径都很好,因为编译时它工作正常。此外,编辑1声明我创建了一个简单的按钮,从上面执行相同的代码,并在安装后工作正常。由于这是在主线程上完成的,并且前面的代码是在与原始线程分离的单独线程中完成的,所以我想知道这是否是问题的原因。 另一个疯狂的事情是,如果文件启动或不启动,我的日志记录会捕获,并且当我遇到原始问题时,它几乎就像启动一样。呸,这一切都很疯狂。

编辑3: 添加了答案。

1 个答案:

答案 0 :(得分:0)

感谢tinstaafl,答案是将UseShellExecute更改为True。我不得不删除RedirectStandardError和RedirectStandardOutput行,但我还没有使用它们。在这方面,感谢大家的调查,如果有人知道为什么会发生这种情况,我全心全意。