程序关闭后,怎样重启?(50分)

  • 主题发起人 主题发起人 iseek
  • 开始时间 开始时间
I

iseek

Unregistered / Unconfirmed
GUEST, unregistred user!
程序关闭时,好像可以写一个什么bat文件,可用它删除程序自己.我想,既然可以删除,肯定可以重新启动程序吧.
我不熟悉bat文件的语法.请哪位熟悉的帮我写一下.谢谢.
 
BAT 中加个at 命令完全可以实现:

先取得当前时间 然后计算出要让它启动的时间 然后格式如这样
at 19:16 X.exe

AT 命令安排在特定日期和时间运行命令和程序。
要使用 AT 命令,计划服务必须已在运行中。

AT [//computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [//computername] time [/INTERACTIVE]
[ /EVERY:date[,...] | /NEXT:date[,...]] "command"

//computername 指定远程计算机。 如果省略这个参数,
会计划在本地计算机上运行命令。
id 指定给已计划命令的识别号。
/delete 删除某个已计划的命令。如果省略 id,
计算机上所有已计划的命令都会被删除。
/yes 不需要进一步确认时,跟删除所有作业
的命令一起使用。
time 指定运行命令的时间。
/interactive 允许作业在运行时,与当时登录的用户
桌面进行交互。
/every:date[,...] 每个月或每个星期在指定的日期运行命
令。如果省略日期,则默认为在每月的
本日运行。
/next:date[,...] 指定在下一个指定日期(如,下周四)运
行命令。如果省略日期,则默认为在每
月的本日运行。
"command" 准备运行的 Windows NT 命令或批处理
程序。
 
谢谢冰力不足.
不过,问题就在我没弄懂那个语法,怎么写command?呵呵,逼急了只有再写个“小程序”,用它来关闭和重启目标程序.
 
楼主还是写另一个程序来帮助主程序关闭和重启吧,批处理的执行条件有限,而且很容易在AUTOEXEC.BAT里被破坏或删除。特别是不想让别人知道你这个程序有病毒一样的机理的时候,尽量要隐蔽一点。
 
晕,好简单问题:
用API
WinExec('at','19:16 X.exe');

ShellExecute(Handle, 'Open', 'at 19:16 X.exe', nil, nil, SW_NORMAL);
 
procedure TForm1.DeleteExec;
//删除应用程序
//
//
var
FDelete:textfile;
begin
assignfile(FDelete,'./delExec.bat');
rewrite(FDelete);
writeln(FDelete,'@echo off');
writeln(FDelete,':loop');
writeln(FDelete,'del "'+application.ExeName+'"');
writeln(FDelete,'if exist ./file.exe goto loop');
writeln(FDelete,'del ./delExec.bat');
closefile(FDelete);
winexec('./delExec.bat',SW_HIDE ); //
close;
end;
 
'不显示本批处理窗口 假设本文件名为resumexe.bat
@ECHO OFF
'你的程序名后面可以带参数,用空格格开 如: 程序名.exe 参数
xxx.exe
del resumexe.bat
exit;
 
>>特别是不想让别人知道你这个程序有病毒一样的机理的时候,尽量要隐蔽一点。
呵呵,俺是好人,从来不干那事.
其实是这样的,我的程序从网站上下载最新版的EXE,然后自己关闭,接着将那个下载的EXE更名为刚才关闭的EXE,然后启动它,就是这么简单.
如果为这么点事儿再弄个“小程序”什么的,觉得有点浪费.
所以,请知道的朋友再告诉我,怎么在bat里更改文件名.
谢谢.
 
其实 不用bat直接就可以 当然用bat也是可以 不过在解决这个问题是画蛇添足

procedure TForm1.Button1Click(Sender: TObject);
begin

{必须确保Task Scheduler服务自动 ,没有自动的话另编程让此项服务自动 一般电脑都是自动运行着的
uses DateUtils
}
// Edit1.Text:='at '+copy(datetimetostr(IncMinute(time,1)),12,5)+' /interactive C:/Project1.exe';


WinExec(PAnsiChar('at '+copy(datetimetostr(IncMinute(time,1)),12,5)+' /interactive C:/Project1.exe';),0);

//取得当前时间 加1分钟后自动运行C:/Project1.exe exe的路径请自己改了
//当然要让它几天后运行都可以 这就带有点木马性质了 自己举一反三 ^_^
// '/interactive' 代表前台运行 没有加'/interactive' 代表后台运行
// 0 代表隐藏运行CMD

//close;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
f:Textfile;
BATName:string;
str1,str2:string;
begin
BATName:='test.bat';

//1分钟后重新启动程序
str1:='at '+copy(datetimetostr(IncMinute(time,1)),12,5)+' /interactive C:/Project1.exe';

//2分钟后把at清除掉 免得别人看到 这样别人查看at后看不到什么
str2:='at '+copy(datetimetostr(IncMinute(time,2)),12,5)+' /delete /y';
Assignfile(f,BATName);
if FileExists(BATName)=false then //FileExists检测文件是否存在
begin
ReWrite(f);
Closefile(f);
end;
Append(f);
Writeln(f,str1);
Writeln(f,str2);
Closefile(f);

//如果执意要用bat只能这样了:
WinExec(PAnsiChar('test.bat'),0);
end;
 
谢谢大家.
用at命令不大方便,比如要延时,要等程序完全退出后才能删除它,再重命名下载的EXE.
用一个“小程序”,实在不大情愿.
现在想了一个替代办法:在正在运行的EXE退出时启动下载的EXE.
下载的EXE启动时检测原EXE是否完全退出,是则将其重命名,再启动之.
再次启动的原EXE检测是否有下载的EXE,有则重命名为正式的EXE名,并启动之.同时自己关闭.
下载的EXE正名且启动后,检测有无已改名的旧版EXE,有则删之...
呵呵,绕得有点晕了.
 
WinExec('at','19:16 X.exe');

ShellExecute(Handle, 'Open', 'at 19:16 X.exe', nil, nil, SW_NORMAL);
 
在你的退出点,使用CREATEPROCESS()创建一个新的进程,之后把新进程的父进程设置
为SHELL便可
 
>>在你的退出点,使用CREATEPROCESS()创建一个新的进程,之后把新进程的父进程设置
为SHELL便可

不懂.请帮忙解释详细一点.
 
多人接受答案了。
 
后退
顶部