2013-12-19 16 views
0

我試圖運行一系列的測試/診斷程序,無論我做什麼,全部同時運行。我假設這是由於程序打開後代碼繼續運行,然後立即執行下一個任務。爲了給出一點背景知識,我已經在基本的基礎上編寫了一個簡單的測試腳本,現在需要使用GUI實現最新的測試腳本。批處理文件會一個接一個地打開程序,因爲它會等到應用程序關閉才移到下一行(除非使用啓動命令)。VB.net中的非併發外部程序

下面是我用VB中的內容:

Private Sub btnRunselect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRunselect.Click 
    If cbDevmgr.Checked = True Then 
     MessageBox.Show("DEVMGR!") 
    End If 
    If cbCamera.Checked = True Then 
     MessageBox.Show("Camera!") 
    End If 
    If cbKeyboard.Checked = True Then 
     MessageBox.Show("Keyboard!") 
    End If 
    If cbMic.Checked = True Then 
     MessageBox.Show("Mic!") 
    End If 
    If cbBit.Checked = True Then 
     MessageBox.Show("Bit!") 
    End If 
End Sub 

這是信息框而不是啓動的程序。

現在批處理代碼是這樣的。

:run1 

echo . 
echo . 
echo ---------------------------------- 
echo .  Final Test 
echo ---------------------------------- 
echo . 
echo . 
SET %S="Final Test" 
\utils\nircmdc\nircmdc mutesysvolume 0 
\utils\nircmdc\nircmdc setsysvolume 65535 
set s=%s: =,% 
\utils\nircmdc\nircmdc speak text %S% 

    :: figure out where the batch drive is 
    for %%a in (c,d,e,f,g,h,i,j) do if exist %%a:\BurnInTest\bit.exe set drv=%%a 

    %drv%: 


echo . 
echo . 
echo ---------------------------------- 
echo.  Device Manager 
echo ---------------------------------- 
echo . 
echo . 

    cd C:\Windows\System32\ 
    devmgmt.msc 
    cd \ 

    %drv%: 


echo . 
echo . 
echo ---------------------------------- 
echo.  Camera Test 
echo ---------------------------------- 
echo . 
echo . 
    \passmark\BurnInTest\AMCap\amcap.exe 

echo . 
echo . 
echo ---------------------------------- 
echo.   Keyboard Test 
echo ---------------------------------- 
echo . 
echo . 
    \passmark\BurnInTest\KeyboardTest\KeyboardTest.EXE -r 

echo . 
echo . 
echo ---------------------------------- 
echo.  Mic Test 
echo ---------------------------------- 
echo . 
echo . 
    \passmark\BurnInTest\SoundCheck\SoundCheck.EXE -R 



    GOTO run6 

RUN6

任何幫助,將不勝感激!提前致謝。

+0

你如何啓動程序?你可以顯示啓動其中一個程序的代碼嗎? – Markus

+0

我開始這樣的過程: Process.Start(「c:\ Windows \ System32 \ devmgmt.msc」) 我將消息框放入隔離器中,稍後在程序中測試其他一些功能。我也嘗試使用DIM xxxx AS NEW system.diagnostics.process字符串來定義該過程,但這也不起作用。 – user3120457

回答

1

看看System.Diagnostics.Process.Start方法。你可以這樣來代替的東西取代你MessageBox的:

Dim P As New System.Diagnostics.Process() 
P.StartInfo.UseShellExecute = False 
P.StartInfo.FileName = "C:\\full\\path\\to.exe" 
P.StartInfo.Arguments = "arguments to pass to program" 
P.Start() ' or P.Start("C:\\full\\path\\to.exe", "arguments") 
P.WaitForExit() 

,將開始與參數的程序,並等待其退出。如果你不想無限期地等待,這個函數有超時的版本。如果您不打電話WaitForExit,則過程開始並且程序流程繼續正常進行。 Here's some info on Process.StartInfoUseShellExecute默認爲true

您也可以使用VB中的Shell函數來啓動一個進程;除了它返回一個進程ID(Process.Start返回true如果它開始),它也是'less.net',因爲它只在Visual Basic運行時庫中可用,所以如果你曾經切換到C#,你仍然可以使用Process.Start'out ',但必須導入Microsoft.VistualBasic運行時(額外的.DLL)才能使用Shell函數。

如果您也對此感到好奇,這裏有一個很好的答案why we need shell execute

希望有所幫助。

+0

感謝您的幫助,但那正是我想要做的。消息框只是佔位符,而我在程序中進一步分類了一些其他代碼。 我無法使waitforexit正常工作。我已經嘗試在process.start結尾處添加它,並將其作爲單獨的一行。我嘗試使用你提到的確切線,但無濟於事。還有其他建議嗎? – user3120457

+0

我修改了我的答案,嘗試了不同的方法來嘗試進程啓動/等待,因爲有時候這樣做可能會讓內容混淆(最顯着的是UseShellExecute行)。 – txtechhelp

+0

太棒了!這工作。當我嘗試聲明我的應用程序時,我不確定自己做錯了什麼,但現在它們正常工作。謝謝! 另外,我很好奇,「useshellexecute = false」行的用法是什麼?它不是默認,因爲你使用start()而不是shell()? – user3120457