2013-07-11 30 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行,但我沒有反正使用它們。在這張照片上,感謝大家的調查,如果有人有一個想法,爲什麼會發生這種情況,我都聽過。

相關問題