start /wait a.exe
start /wait b.exe
.....

解决方案 »

  1.   

    试着使用一下lock关键字,将进程索住。只是提供一个思路,我没做过这方面的安装包。
      

  2.   


     Process p1 = new Process();
                p1.StartInfo.FileName = "setup1.exe";
                p1.Start();
                p1.Exited += new EventHandler(p_Exited);
                p1.EnableRaisingEvents = true;void p1_Exited(object sender, EventArgs e)
            {            Process p2 = new Process();
                p2.StartInfo.FileName = "setup2.exe";
                p2.Start();
    p2.Exited += new EventHandler(p2_Exited);
                p2.EnableRaisingEvents = true;        }
    void p2_Exited(object sender, EventArgs e)
            {            Process p3 = new Process();
                p3.StartInfo.FileName = "setup3.exe";
                p3.Start();
    p3.Exited += new EventHandler(p3_Exited);
                p3.EnableRaisingEvents = true;        }````试试
      

  3.   

    这种问题还需要VS来打包么,
    做好BAT文件,
    echo off 
    cls
    start /wait a.exe 
    start /wait b.exe 
    .......
    或者用WINRAR打成EXE包,选择先行文件,搞定.
      

  4.   

    一个exe运行一定是有一个进程的,您可不可以在启动下一个的时候去判断下进程是否还在?
      

  5.   

    谢谢各位的热心,希望看到具体的code。
      

  6.   

    两个方法你试试看:
    1,对WaitForExit加参数
      if (ps.WaitForExit(0) == true) {
            //执行下一个程序
        }
    2.在打包时设置每个项目的依赖项,这样打包程序会自动按序生成与打包
      

  7.   


    我这样做了,但是根本就,没有效果,不会进入p1_Exited之类的函数而且安装进度结束。
      

  8.   

    关注下,批量打包..
     我想出现楼主那样的错误可能是进程同步了的原因
     你将进程锁定下,一个一个的执行用LOCK
      

  9.   


    //获取安装路径
                string dir = this.Context.Parameters["targetdir"];            ProcessStartInfo psi = new ProcessStartInfo();
                psi.WorkingDirectory = dir + "\\Geomedial6";
                psi.FileName = dir + @"\Geomedial6\setup.exe";
                //psi.UseShellExecute=true;   //msi文件,如是exe不用设   
                Process ps = Process.Start(psi);
    if (ps != null)
    {

                //等待该进程安装结束
                ps.WaitForExit();
    }这样试试
      

  10.   

    if (ps != null) 

                //等待该进程安装结束 
                ps.WaitForExit(); 
    //do some thing后面的操作都放在这里,而不是外面

    应该这样
      

  11.   


    确实可行,确实不好看。谢谢!这恐怕是最后一招了,
    不过大家说了很多的lock,很感兴趣,能不能代码演示一下?
      

  12.   

    做成name.bat文件
    运行這個bat文件,是可以解决這個问题的
    我以前也是这种情况,其他解决方法还不晓得
      

  13.   

    我按你的最初的办法就可以啊,一个进程结束才会运行另一个进程...
    改成下面这样呢?不要那么多新的变量名,还可以优化成循环操作:         //获取安装路径
                string dir = this.Context.Parameters["targetdir"];            ProcessStartInfo psi = new ProcessStartInfo();
                psi.WorkingDirectory = dir + "\\Geomedial6";
                psi.FileName = dir + @"\Geomedial6\setup.exe";
                //psi.UseShellExecute=true;   //msi文件,如是exe不用设   
                Process ps = Process.Start(psi);
                //等待该进程安装结束
                ps.WaitForExit();            psi = new ProcessStartInfo();
                psi.WorkingDirectory = dir + "\\GeomedialPlugins";
                psi.FileName = dir + @"\GeomedialPlugins\06.00.35.02.exe";
                ps = Process.Start(psi);
                ps.WaitForExit();            psi = new ProcessStartInfo();
                psi.WorkingDirectory = dir + "\\GeomedialPlugins";
                psi.FileName = dir + @"\GeomedialPlugins\GMP06003506.exe";
                Process ps = Process.Start(psi);
                ps.WaitForExit();            psi = new ProcessStartInfo();
                psi.WorkingDirectory = dir + "\\bat";
                psi.FileName = dir + @"\bat\Add2Assembly.bat";
                ps = Process.Start(psi);
                ps.WaitForExit();
      

  14.   

     
    做批处理是最好的解决方案 
    echo off 
    cls 
    start /wait 程序一.exe 
    start /wait 程序二.exe 
      

  15.   


    这样还是不行,不晓得各位自己做过没?ps.WaitForExit(); 真正目的是启动一个进程,启动完了就exit,而不是改进程的结束!!!
      

  16.   


    这个方式不行,我试过了,估计是你没有等待足够长的时间,我之前也被欺骗了;ps.WaitForExit(); 真正目的是启动一个进程,启动完了就exit,而不是改进程的结束!!! 
      

  17.   


    问一个问题,我是这么写的:
    [code=BatchFile]
    echo off 
    cls 
    echo 开始安装framework2.0,预计需要10分钟左右时间.......
    start /wait .\dotnetfx_38669.exe
    echo 开始安装GeoMediaPro06,预计需要10分钟左右时间.......
    start /wait .\GeoMediaPro06.00.34.07\GeoMedia Professional.msi 
    echo 开始安装GeoMediaPro06补丁06.00.35.02,预计需要8分钟左右时间.......
    start /wait .\06.00.35.02.exe
    echo 开始安装GeoMediaPro06补丁GMP06003506,预计需要8分钟左右时间.......
    start /wait .\GMP06003506.exe
    echo 开始注册相关组件,预计需要2分钟左右时间.......
    start /wait .\DevExpress.Dll\Add2Assembly.bat
    echo GIS运行环境安装结束!
    echo on
    pause 结果是:
    .\GeoMediaPro06.00.34.07\GeoMedia Professional.msi报错,找不到文件
    而且
    .\DevExpress.Dll\Add2Assembly.bat也报错!
    难道我写错了??
    [/code]
      

  18.   

    有空格吧“”起来试试
    "\GeoMediaPro06.00.34.07\GeoMedia Professional.msi"
      

  19.   

    Process[] processes;processes=Process.GetProcesses(); 
    bool Done;执行a.exe...do
    {
        Done=true;
        foreach (Process process in processes) 
            if (process.ProcessName == "a.exe")
            {
                Done=false;
                break;
            }
    }
    while (!Done);执行b.exe...do
    {
        Done=true;
        foreach (Process process in processes) 
            if (process.ProcessName == "b.exe")
            {
                Done=false;
                break;
            }
    }
    while (!Done);
      

  20.   


    Process[] processes; processes=Process.GetProcesses(); 
    bool Done; 执行a.exe... do 

        Done=true; 
        foreach (Process process in processes) 
            if (process.ProcessName == "a.exe") 
            { 
                Done=false; 
                break; 
            } 

    while (!Done); 执行b.exe... processes=Process.GetProcesses(); do 

        Done=true; 
        foreach (Process process in processes) 
            if (process.ProcessName == "b.exe") 
            { 
                Done=false; 
                break; 
            } 

    while (!Done); 
      

  21.   

    我现在也在弄这个,想问下在安装的对话框输入的数据如数据库名之类的,怎么提交关联到继承installer的那个类去阿
      

  22.   

    具体细节没看明白,问一下:
    这几个 exe 单纯是为了安装或者配置之类而制作的 仅 执行一次的文件,还是安装后需要使用的用户程序?
    最主要的是,这几个 exe 是你自己的吗?我初步分析,他们仅执行一次。如果是自己的,可以改动下他们,让他们内部调用——a 运行完成,结束自己,内部调用 b。这个办法也许不高明,不过可以准确做到连续调用
      

  23.   

    首先,你要知道安装程序是如何工作的。你的EXE只是一个loader,运行完就退出了,安装过程是由install service完成的,所以你的Wait只是等exe完成运行而不是安装。如果你的所有安装程序都是你自己的,你可以为每个安装程序写一个安装类,通过使用信号量同步的方式来完成等待。
      

  24.   

    顶一个
    第一感觉是把每个exe在一个进程里实现,各个进程之间顺序执行
    关注...
      

  25.   

    这可能就是WaitForExit看上去失败的原因,因为你启动的进程又生成了一个新进程,然后结束了,这时WaitForExit就返回了.
      

  26.   

    那用process的ID来判断能行吗?
      

  27.   

    非常感谢各位的参与,最后我发现我自己犯了一个不可饶恕的错误!!
    错误是这样的:
    其实ps.waitforexit();这个事件是完全可以检测一个安装的进程是否结束,
    即,我原来自己的代码根本就没有问题,而之所以我认为有错误,实际是因为我测试的exe是两个该死的压缩包!!
    所以,一旦将这个exe加压后,自然这个安装就结束了!!!!真想抽自己耳光。另外,批处理已经成功,waitforexit也成功。不过对于38的代码更是感激不尽!!!谢谢各位,希望不会的朋友能学到东西!!待会结贴!