2013-07-11 33 views
0

好吧,这是一个让我难以置信的难题。我有一个程序要安装在不同的计算机上,它应该在完成特定任务后执行批处理文件。批处理文件由用户通过我们的web服务进行配置,应用程序将此路径字符串拉下来,然后在该路径上执行该文件。应该非常简单/直接,对吗?VB.NET启动批处理文件安装后不工作

代码:

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: 添加了答案。

+2

您是否尝试过将UseShellExecute设置为true? – tinstaafl

+0

嗯。不我没有。我不太清楚我是否理解整个命令的工作原理。该属性的真假之间有什么区别? –

+0

从[MSDN](http://msdn.microsoft.com/zh-cn/library/vstudio/system.diagnostics.processstartinfo.useshellexecute%28v=vs.100%29.aspx)页面:'获取或设置一个值,指示是否使用操作系统shell启动进程。当您使用操作系统shell启动进程时,可以启动任何文档(与任何具有默认打开操作的可执行文件关联的已注册文件类型),并使用Process对象对文件执行操作(如打印) 。当UseShellExecute为false时,只能使用Process对象启动可执行文件。' – tinstaafl

回答

0

感谢tinstaafl,答案是将UseShellExecute更改为True。我不得不删除RedirectStandardError和RedirectStandardOutput行,但我没有反正使用它们。在这张照片上,感谢大家的调查,如果有人有一个想法,为什么会发生这种情况,我都听过。

相关问题