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);
是 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);
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; }````试试
做好BAT文件,
echo off
cls
start /wait a.exe
start /wait b.exe
.......
或者用WINRAR打成EXE包,选择先行文件,搞定.
1,对WaitForExit加参数
if (ps.WaitForExit(0) == true) {
//执行下一个程序
}
2.在打包时设置每个项目的依赖项,这样打包程序会自动按序生成与打包
我这样做了,但是根本就,没有效果,不会进入p1_Exited之类的函数而且安装进度结束。
我想出现楼主那样的错误可能是进程同步了的原因
你将进程锁定下,一个一个的执行用LOCK
//获取安装路径
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();
}这样试试
{
//等待该进程安装结束
ps.WaitForExit();
//do some thing后面的操作都放在这里,而不是外面
}
应该这样
确实可行,确实不好看。谢谢!这恐怕是最后一招了,
不过大家说了很多的lock,很感兴趣,能不能代码演示一下?
运行這個bat文件,是可以解决這個问题的
我以前也是这种情况,其他解决方法还不晓得
改成下面这样呢?不要那么多新的变量名,还可以优化成循环操作: //获取安装路径
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();
做批处理是最好的解决方案
echo off
cls
start /wait 程序一.exe
start /wait 程序二.exe
这样还是不行,不晓得各位自己做过没?ps.WaitForExit(); 真正目的是启动一个进程,启动完了就exit,而不是改进程的结束!!!
这个方式不行,我试过了,估计是你没有等待足够长的时间,我之前也被欺骗了;ps.WaitForExit(); 真正目的是启动一个进程,启动完了就exit,而不是改进程的结束!!!
问一个问题,我是这么写的:
[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]
"\GeoMediaPro06.00.34.07\GeoMedia Professional.msi"
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);
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);
这几个 exe 单纯是为了安装或者配置之类而制作的 仅 执行一次的文件,还是安装后需要使用的用户程序?
最主要的是,这几个 exe 是你自己的吗?我初步分析,他们仅执行一次。如果是自己的,可以改动下他们,让他们内部调用——a 运行完成,结束自己,内部调用 b。这个办法也许不高明,不过可以准确做到连续调用
第一感觉是把每个exe在一个进程里实现,各个进程之间顺序执行
关注...
错误是这样的:
其实ps.waitforexit();这个事件是完全可以检测一个安装的进程是否结束,
即,我原来自己的代码根本就没有问题,而之所以我认为有错误,实际是因为我测试的exe是两个该死的压缩包!!
所以,一旦将这个exe加压后,自然这个安装就结束了!!!!真想抽自己耳光。另外,批处理已经成功,waitforexit也成功。不过对于38的代码更是感激不尽!!!谢谢各位,希望不会的朋友能学到东西!!待会结贴!