主题:定时关机的疑难?
masachik
[专家分:540] 发布于 2007-11-25 01:28:00
本栏目曾有过一篇关于定时关机的疑问帖。moz前辈对此给了较全面的答复。我也试用了moz前辈提供的方法。但在应用中我有个疑难难以解决,不知有无高手能帮我解决?
为了限制小孩玩电脑时间,我希望在启动某个程序时先启动定时关机程序。我用moz前辈提供的第三法与第二法(附后)解决,都会出现关机警告窗口且始终位于前方,防碍程序运行。我还想试用使用 at time shutdown -s ,但好象在我的机子上它不起作用。我查看了AT 的用法,似乎在用 AT TIME ‘命令’前要先启动计划任务程序,我也不知道计划任务程序的文件名,不知如何下手?
附:
第二法:
在DOS批处理文件中直接用shutdown
shutdown -s -t 1800
其他要执行的程序
第三法:
用vfp生成一个.exe文件
ak=CREATEOBJECT("shell.application")
ak.ShellExecute("shutdown"," -s -t 1800",,,2)
!其他要执行的程序
回复列表 (共11个回复)
沙发
cbl518 [专家分:57140] 发布于 2007-11-25 06:05:00
使用 at 命令时,要求您必须是本地 Administrators 组的成员。
at 6:00 "shutdown -s -t 0"
板凳
moz [专家分:37620] 发布于 2007-11-25 11:15:00
开始 - 所有程序 - 附件 - 系统工具 -\
开始 - 控制面板 -/ 任务计划 - 高级 - 开始使用任务计划程序
\Windows\System32\Schtasks.exe
3 楼
moz [专家分:37620] 发布于 2007-11-25 11:18:00
SCHTASKS /parameter [arguments]
描述:
允许管理员创建、删除、查询、更改、运行和中止
本地或远程系统上的计划系统。替代 AT.exe。
参数列表:
/Create 创建新计划任务。
/Delete 删除计划任务。
/Query 显示所有计划任务。
/Change 更改计划任务属性。
/Run 立即运行计划任务。
/End 中止当前正在运行的计划任务。
/? 显示帮助/用法。
示例:
SCHTASKS
SCHTASKS /?
SCHTASKS /Run /?
SCHTASKS /End /?
SCHTASKS /Create /?
SCHTASKS /Delete /?
SCHTASKS /Query /?
SCHTASKS /Change /?
4 楼
moz [专家分:37620] 发布于 2007-11-25 11:26:00
其实最好还是使用休眠,(要先打开休眠功能)
可以用VFP做一个隐藏的定时器,(最好还是使用计划任务)
[quote]XP的休眠命令是
rundll32.exe powrprof.dll,SetSuspendState
如果想通过命令行来休眠,可以在开始,运行里输入上述命令[/quote]
好处就是不破坏现场,重开机即可恢复,且速度比开关机快多得多
我现在基本上不关机,全是休眠.
5 楼
masachik [专家分:540] 发布于 2007-11-25 23:10:00
谢谢楼上二位,特别是moz前辈。
我打开‘计划任务窗口’的‘高级’菜单后,未见到‘开始使用任务计划程序’菜单项(有‘停止使用任务计划程序’、‘暂停使用任务计划程序’菜单项,这可能说明计划任务程序是已经启动了的。但无论是在批处理文件中或是运行框中使用 at 6:00 "shutdown -s -t 0" 形式命令,都不会在指定时间关机。
在批处理文件中或是运行框中使用以下命令行能在指定时间关机:
Schtasks.exe /create /RU username /RP password /sc ONce /TN closej /TR "Shutdown -s -t 0" /st 21:34:00
现在还有个难道是,如何将指定时间改变为命令运行时刻(time)后的某一时刻。即如果%time%o为15:21:34.12,如何另设一变量closetime,使%closetime%为15:51:34。我查了一下set命令,有关它的用法我实在看不懂。不知有无高手能指教一二?
当然,能使用shutdown -s -t 1800而想法去掉‘关机警告窗口’更好。
moz前辈在上面提到使用‘休眠’命令,我在批处理文件文件中试用了下面的命令行,能在指定时间进入休眠。
Schtasks.exe /create /RU username /RP password /sc ONce /TN closej /TR "rundll32.exe powrprof.dll,SetSuspendState" /st 21:34:00
6 楼
moz [专家分:37620] 发布于 2007-11-26 00:54:00
如果你是在VFP中编程,
可以进行时间运算,
并转换成字符串格式,
而用于命令参数上.
在批处理中,我想不起来这些运算是否有现成的方法或函数,set只处理字符串常量,
不过仍然可以使用工具写这些函数以调用(QB,VBS,FB,甚至BAT也是可以返回值的)
我现在能想到的去掉警告窗口的唯一办法就是----即时强制关机.
(比休眠不好的地方就是完全破坏当时情景,
文档不能正确保存,<也许有OFFICE的定时保存错误恢复机制>
网页,应用程序等等等等全部强行关闭,当时数据完全丢失,
VFP数据表极有可能在这个时候未来得及保存而发生错误,
如果不强行关机,又会无奈的停留在等待处理的僵局,
所以个人极力建议使用休眠)
以前感觉,且也听说过这样的说法,
"启用计划任务会占用系统资源," --感觉这是有道理的,
但后来往深处想,Windows的分时机制,与DOS相去甚远.
除非你超负荷的长时间高耗运行,否则计划任务只占用有限的空闲的一瞬间去检查时间和任务,
而且又不是同时间几亿个检查,所以区别是微不足道的,而且更能体现Windows的多任务特性.
如果仅仅是为了限制小孩子用电脑的时间
(确有此必要,小孩自制力有限,而且辐射以及显示器对眼睛的伤害都是很严重的.)
可以尝试自己用VFP(最好是使用VB或VBS等写,放到启动中去)按照自己的要求来写,
不然,也可以到网上一些大网站去搜索一下相关的工具,我记得以前自己不会的时候,
也曾下过别人写的程序.(再次提醒慎重,下载的东西如无绝对把握建议还是要先杀毒)
用后感觉应该还可以(时间太久了)
7 楼
masachik [专家分:540] 发布于 2007-12-03 09:26:00
谢谢MOZ前辈,在你的指点下,我已用vfp达到目的。
不过这种方式有两个弱点:1、由VFP生成的EXE文件需要VFP的运行库。2、还不知道这种 EXE 文件能不能传递参数,以便将要执行的应用程序用参数传递而不直接固定到EXE文件中。
VB中有处理时间变量的方法,也不知那些方法在VBS中能不能用?另外,VBS中能不能调用EXE程序?下面的代码能不能传递参数给closej.cmd文件?如果明确这些问题,使用VBS脚本或许更好。
Set oShell= WScript.CreateObject("WScript.Shell")
a = oShell.Run ("closej.cmd",0)
8 楼
moz [专家分:37620] 发布于 2007-12-03 20:28:00
你多尝试便能知道了,
通常太容易得到的东西不是自己的收获,
而且感受不深刻也不可靠.
VBS中调用EXE也是要通过对象来运行的.
传递参数问题很简单,
就算不能直接传递,
文件总是可以的吧?
VB编译的EXE也是需要运行库支持的.
如果只是自己用的机器,放系统库去就好了.
(微软是信任自己出产的产品的.)
如果是别人的机器,检测一下运行一次安装过程就好了.
既然你会用VB,如果不是非要用VFP的数据库的话,
建议你直接使用VB好了,起码比VFP要好一些.
9 楼
masachik [专家分:540] 发布于 2007-12-03 21:58:00
Set oShell= WScript.CreateObject("WScript.Shell")
a = oShell.Run ("closej.cmd",0)
以上代码我是为寻求消除运行批处理文件出现的DOS窗口的方法时在网上查知的。其中的0这个参数我也不知道它的意义。oShell.Run()能不能再带传给 closej.cmd 的参数,传给 closej.cmd 的参数在.CMD文件中该如何处理才能被它里面的程序所使用。不清楚这些问题,即使在vbs中由当前时刻得出了另一时刻的字符表达式,Schtasks.exe /create /RU username /RP password /sc ONce /TN closej /TR "rundll32.exe powrprof.dll,SetSuspendState" /st 21:34:00语句也无法使用。因此还是希望前辈们能明示。
10 楼
moz [专家分:37620] 发布于 2007-12-04 00:58:00
"前辈" 这个称呼不要拿来给我,别人喜欢我可不喜欢
(因为我额顶光可照人,老相,把我叫老了的话,大忌,呵呵)
你是不是用VBS来写?
VFP是比较特殊的,要注意它与VB系列(VB,VB.net,VBA,VBS)的区别(看,又在这里装权威了)
s1=" /create /RU username /RP password /sc ONce /TN closej /TR "+chr(34)+"rundll32.exe powrprof.dll,SetSuspendState"+chr(34)+" /st 21:34:00 "
set ak=CREATEOBJECT("shell.application")
ak.ShellExecute "Schtasks.exe",s1,,,0
至于0的含义,估计是这样子的[quote]
intWindowStyle
这是为新进程在 STARTUPINFO 结构内设置的 wShowWindow 元素的值。其意义与 ShowWindow 中的 nCmdShow 参数相同,可取以下值之一。名称 值 含义
SW_HIDE
0 隐藏窗口并激活另一窗口。
SW_MINIMIZE
6 最小化指定窗口并激活按 Z 序排序的下一个顶层窗口。
SW_RESTORE
9 激活并显示窗口。若窗口是最小化或最大化,则恢复到原来的大小和位置。在还原应用程序的最小化窗口时,应指定该标志。
SW_SHOW
5 以当前大小和位置激活并显示窗口。
SW_SHOWMAXIMIZED
3 激活窗口并以最大化显示该窗口。
SW_SHOWMINIMIZED
2 激活窗口并以最小化显示该窗口。
SW_SHOWMINNOACTIVE
7 最小化显示窗口。活动窗口保持活动。
SW_SHOWNA
8 以当前状态显示窗口。活动窗口保持活动。
SW_SHOWNOACTIVATE
4 按窗口最近的大小和位置显示。活动窗口保持活动。
SW_SHOWNORMAL
1 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。 [/quote]
这里有个网址,可能对你会有点帮助:
[url]http://www.elook.net.cn/handbook/this_content/aspobject.htm[/url]
我来回复