VB.net中的非并发外部程序

时间:2013-12-19 19:48:22

标签: vb.net batch-file process

我正在尝试连续运行一组测试/诊断程序,无论我做什么,都会同时运行。我假设这是因为程序打开后代码继续运行,然后立即执行sub中的下一个任务。    为了给出一点背景知识,我在前一段时间内已经编写了一个简单的测试脚本,现在需要使用GUI来实现它。批处理文件将一个接一个地打开程序,因为它会等到应用程序关闭然后移动到下一行(除非使用start命令)。

以下是我在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

用messagebox代替程序启动。

现在,批处理代码是这样的。

: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

任何帮助都会非常感激!提前谢谢。

1 个答案:

答案 0 :(得分: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),它也减少了.NET'因为它只能在Visual Basic运行时库中使用,所以如果你切换到C#,你仍然可以使用开箱即用的Process.Start'但是必须导入Microsoft.VistualBasic运行时(额外的.DLL)才能使用Shell函数。

如果您对此感到好奇,那么why we need shell execute就是一个很好的答案。

希望有所帮助。