2014-09-18 45 views
0

我想從我的Vb.Net應用程序運行批處理文件。 VS 2010 targetting .Net 4.從.Net調用的批處理文件不運行

它在Windows XP下正常工作。

在Windows 8下,我按預期得到了UAC提示,並且我看到命令窗口會短暫出現,但它會立即消失,批處理文件中的任何命令似乎都不會執行。

我試着用一個pause命令替換批處理文件,但是窗口仍然沒有等待輸入而消失。 這裏是我的代碼:

processStartInfo = New System.Diagnostics.ProcessStartInfo() 
    processStartInfo.FileName = Script ' batch file name 

    If My.Computer.Info.OSVersion >= "6" Then ' Windows Vista or higher 
     ' required to invoke UAC 
     processStartInfo.Verb = "runas" 
    End If 

    processStartInfo.Arguments = Join(Parameters, " ") 
    processStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal 
    processStartInfo.UseShellExecute = True 

    process = System.Diagnostics.Process.Start(processStartInfo) 
+0

將「暫停」添加到.bat文件的末尾,以便您可以閱讀錯誤消息。永遠不要忘記檢查Process.ExitCode,以便診斷完整的故障。 – 2014-09-18 16:34:30

+0

@Hans正如我在問題中所述,我用單個暫停命令替換了整個批處理文件,但該窗口立即消失。 我也許可以嘗試查看Process.ExitCode,但我假設正在顯示命令窗口(儘管非常簡短),該過程看起來開始OK。我不希望我的代碼等待進程完成,儘管我可能暫時爲了調試目的而這樣做。 – 2014-09-18 16:42:25

+0

如果您重命名.bat以使其找不到,那麼Process.Start應拋出「找不到文件」異常。這是否發生? – 2014-09-18 17:02:00

回答

0

好的。問題似乎是,cmd.exe根據它們是否包含引號字符來對其參數進行不同的處理。解決這個問題。我直接調用cmd.exe而不是使用ShellExecute,並將整個命令放在引號中。

Dim script As String = My.Application.Info.DirectoryPath & "\Test.bat" 
RunCommand(script, """a quoted string""", "string2") 

Private Function RunCommand(Script As String, ParamArray Parameters() As String) As Boolean 

    Dim process As System.Diagnostics.Process = Nothing 
    Dim processStartInfo As System.Diagnostics.ProcessStartInfo 
    Dim OK As Boolean 

    processStartInfo = New System.Diagnostics.ProcessStartInfo() 
    processStartInfo.FileName = """" & Environment.SystemDirectory & "\cmd.exe" & """" 

    If My.Computer.Info.OSVersion >= "6" Then ' Windows Vista or higher 
     ' required to invoke UAC 
     processStartInfo.Verb = "runas" 
    End If 

    processStartInfo.Arguments = "/C """"" & Script & """ " & Join(Parameters, " ") & """" 
    processStartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal 
    processStartInfo.UseShellExecute = False 

    'MsgBox("About to execute the following command:" & vbCrLf & processStartInfo.FileName & vbCrLf & "with parameters:" & vbCrLf & processStartInfo.Arguments) 
    Try 
     process = System.Diagnostics.Process.Start(processStartInfo) 
     OK = True 
    Catch ex As Exception 
     MsgBox(ex.ToString, MsgBoxStyle.Exclamation, "Unexpected Error running update script") 
     OK = False 
    Finally 
     If process IsNot Nothing Then 
      process.Dispose() 
     End If 
    End Try 

    Return OK 

End Function