找回密码
 加入
搜索
查看: 11013|回复: 28

一个有趣的问题-程序自身重启

 火.. [复制链接]
发表于 2008-10-26 17:12:50 | 显示全部楼层 |阅读模式
写了段代码转成EXE文件,我们先假设这个EXE文件为:1.exe,该EXE文件最后有一个代码是:
ProcessClose("1.exe")
Run (@ScriptDir &"\1.exe")

意思是结束1.exe,再重启1.exe。现在的问题是因为这个1.exe已经被自己结束了,也就是ProcessClose("1.exe"),所以根本不会去执行Run (@ScriptDir &"\1.exe"),所以无论如何这个代码只能是运行到结束1.exe这个进程后就中止了,不能支重启1.exe了。

请问如何解决这一问题?让他可以自已重启。

[ 本帖最后由 charson 于 2008-11-1 11:43 编辑 ]
发表于 2008-10-26 17:28:56 | 显示全部楼层
另外再写一个执行 1.exe 的程序(run1.exe)。

run1.exe 头部最好 sleep 1、2 秒钟

Run (@ScriptDir &"\run1.exe")

ProcessClose("1.exe")
发表于 2008-10-26 18:58:09 | 显示全部楼层
写个自删除的vbs呗
发表于 2008-10-26 19:14:01 | 显示全部楼层
bat 也行呀,看你想怎么玩了
 楼主| 发表于 2008-10-27 08:27:02 | 显示全部楼层
大家的思路都是另写一个BAT或VBS或AU3来执行重启任务,自身执行重启真的不可能完成吗?
发表于 2008-10-27 11:31:41 | 显示全部楼层
api?不过是不是会很麻烦,问问snow,三恨等人

[ 本帖最后由 netegg 于 2008-10-27 11:33 编辑 ]
发表于 2008-10-27 11:58:54 | 显示全部楼层
思路是在OnAutoItExit函数中使用at命令, 让系统在下一秒钟调用自身这个exe.
关于时间的计算自己想想

at /?
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 命令或批处理程序。
发表于 2008-10-27 12:36:36 | 显示全部楼层
这样试试,获取进程的路径就好办了,at是内部命令吗,好像不是吧(是不是需要外部文件)
发表于 2008-10-27 12:54:46 | 显示全部楼层
原帖由 netegg 于 2008-10-27 12:36 发表
这样试试,获取进程的路径就好办了,at是内部命令吗,好像不是吧(是不是需要外部文件)


at是windows的设置计划服务的命令, 在自身程序已结束返回的情况下, 自身进程已死, 要通过windows系统来调度程序再次执行了.
RunWait(@ComSpec & " /c " & "at...")
发表于 2008-10-28 22:30:50 | 显示全部楼层
用双进程也可以
发表于 2008-10-29 10:26:59 | 显示全部楼层
Run(@ComSpec&' /c ping 127.0.0.1 -n 3&'"@ScriptFullPath"'&exit',@SystemDir,@SW_HIDE)
发表于 2008-10-29 17:01:24 | 显示全部楼层
程序自身重启的意义何在??

如果需要重运行程序的哪部分代码,可以完全重运行这部分代码,没必要重运行程序自身

这个是在程序设计阶段要解决的问题,不应该以这种方式解决
发表于 2008-10-29 18:37:06 | 显示全部楼层
MsgBox(0,"",@ComSpec)
ShellExecute(@ComSpec," /c ping 127.0.0.1 -n 3&start "&FileGetShortName(@AutoItExe),"","",@SW_HIDE)
ProcessClose(@ScriptName)

你要的是这个吧
发表于 2008-10-29 18:47:28 | 显示全部楼层
MsgBox(0,"",@ComSpec)
ShellExecute(@AutoItExe)
ProcessClose(@ScriptName)

这样子写更简单
发表于 2008-10-31 00:55:52 | 显示全部楼层
先run后exit就可以了,在子程序的“防止多开”代码执行前,父进程就退出了

此问题已解决。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-27 15:37 , Processed in 0.123647 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表