好吧,這是一個讓我難以置信的難題。我有一個程序要安裝在不同的計算機上,它應該在完成特定任務後執行批處理文件。批處理文件由用戶通過我們的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: 添加了答案。
您是否嘗試過將UseShellExecute設置爲true? – tinstaafl
嗯。不我沒有。我不太清楚我是否理解整個命令的工作原理。該屬性的真假之間有什麼區別? –
從[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