charson 发表于 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")

gto250 发表于 2008-10-26 18:58:09

写个自删除的vbs呗

netegg 发表于 2008-10-26 19:14:01

bat 也行呀,看你想怎么玩了

charson 发表于 2008-10-27 08:27:02

大家的思路都是另写一个BAT或VBS或AU3来执行重启任务,自身执行重启真的不可能完成吗?

netegg 发表于 2008-10-27 11:31:41

api?不过是不是会很麻烦,问问snow,三恨等人

[ 本帖最后由 netegg 于 2008-10-27 11:33 编辑 ]

gzken 发表于 2008-10-27 11:58:54

思路是在OnAutoItExit函数中使用at命令, 让系统在下一秒钟调用自身这个exe.
关于时间的计算自己想想

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

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

\\computername       指定远程计算机。 如果省略这个参数, 会计划在本地计算机上运行命令。
id                   指定给已计划命令的识别号。
/delete            删除某个已计划的命令。如果省略 id, 计算机上所有已计划的命令都会被删除。
/yes               不需要进一步确认时,跟删除所有作业的命令一起使用。
time               指定运行命令的时间。
/interactive         允许作业在运行时,与当时登录的用户桌面进行交互。
/every:date[,...]    每个月或每个星期在指定的日期运行命令。如果省略日期,则默认为在每月的
                     本日运行。
/next:date[,...]   指定在下一个指定日期(如,下周四)运行命令。如果省略日期,则默认为在每
                     月的本日运行。
"command"            准备运行的 Windows NT 命令或批处理程序。

netegg 发表于 2008-10-27 12:36:36

这样试试,获取进程的路径就好办了,at是内部命令吗,好像不是吧(是不是需要外部文件)

gzken 发表于 2008-10-27 12:54:46

原帖由 netegg 于 2008-10-27 12:36 发表 http://www.autoitx.com/images/common/back.gif
这样试试,获取进程的路径就好办了,at是内部命令吗,好像不是吧(是不是需要外部文件)

at是windows的设置计划服务的命令, 在自身程序已结束返回的情况下, 自身进程已死, 要通过windows系统来调度程序再次执行了.
RunWait(@ComSpec & " /c " & "at...")

rolaka 发表于 2008-10-28 22:30:50

用双进程也可以

78391493 发表于 2008-10-29 10:26:59

Run(@ComSpec&' /c ping 127.0.0.1 -n 3&'"@ScriptFullPath"'&exit',@SystemDir,@SW_HIDE)

skyfree 发表于 2008-10-29 17:01:24

程序自身重启的意义何在??

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

这个是在程序设计阶段要解决的问题,不应该以这种方式解决

gto250 发表于 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)

你要的是这个吧

gto250 发表于 2008-10-29 18:47:28

MsgBox(0,"",@ComSpec)
ShellExecute(@AutoItExe)
ProcessClose(@ScriptName)

这样子写更简单

asdf 发表于 2008-10-31 00:55:52

先run后exit就可以了,在子程序的“防止多开”代码执行前,父进程就退出了

此问题已解决。
页: [1] 2
查看完整版本: 一个有趣的问题-程序自身重启