标题: 98下仅用批处实现“开机n次后执行某一命令“
[打印本页]
作者: fffcw
时间: 2007-1-21 11:31
标题: 98下仅用批处实现“开机n次后执行某一命令“
执行什么命令不重要,比如建立文件,删除文件等等
重要的是如何在 开机n次后才执行,而且次数可以设定
更重要的是要在win98下实现
望大家不吝赐教
在这里找了很久,大多数代码98下都不能执行
我自己花了一天终于实现了意图,这基本上是我独立编的第一个程序
但是我的办法非常拙劣
等到大家给出自己的答案后,我再公布自己的办法
只为换得大家一笑
谢谢
作者: lotus516
时间: 2007-1-22 02:51
有那么神密么?还要我们贴了才给看,本人不才贴一个!!
@echo off
if not exist c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt echo 0 >c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt
setlocal enabledelayedexpansion
for /f %%i in (c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt) do (
if "%%i"=="7" echo %%i&&exit
set /a num=%%i+1
echo !num! >c:\%date:~0,4%%date:~5,2%%date:~8,2%%.txt
set /a wj=%date:~0,4%%date:~5,2%%date:~8,2%-1
del c:\!wj!.txt
exit
)
要次数的话和运行的程序自己把 if "%%i"=="7" echo %%i&&exit改了!!
98不支持for是不?那么这个呢?
@echo off
if not exist c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt echo 0 >c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt
setlocal enabledelayedexpansion
set /p num=<c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt
echo !num!
if !num! gtr 7 echo 成功&&exit
set /a num+=1
echo !num! >c:\%date:~0,4%%date:~5,2%%date:~8,2%%.txt
set /a wj=%date:~0,4%%date:~5,2%%date:~8,2%-1
del c:\!wj!.txt
exit
无98无法测
[
Last edited by lotus516 on 2007-1-22 at 12:01 PM ]
作者: electronixtar
时间: 2007-1-22 03:59
98不支持 for /f 滴 -_-!
作者: zh159
时间: 2007-1-22 13:28
DOS 下好像没有set/a
试试:
@echo off
if not exist c:\Num.bat >c:\Num.bat echo set Num=*
call Num.bat
if "%Num%" == "*******" goto run
set Num=%Num%*
>Num.bat echo set Num=*
goto end
:run
start ......
:end
exit
PS:没有环境测试
作者: zch1366
时间: 2007-1-23 01:45
XP下又如何编写啊..请各位大哥赐教...谢谢
作者: heicai
时间: 2007-1-23 02:10
为什么要用98?
作者: lotus516
时间: 2007-1-23 03:48
Quote: |
Originally posted by zch1366 at 2007-1-23 01:45:
XP下又如何编写啊..请各位大哥赐教...谢谢 |
|
不是贴了三个么?
作者: binghejin
时间: 2007-1-23 04:23
基本思路,不知对否!
if not exist %windir%\3 goto 2(假设要运行3次后执行)
goto start
:2
if not exist %windir%\2 goto 1
ren %windir%\2 3
goto end
:1
if not exist %windir%\1 goto jl
ren %windir%\1 2
goto end
:jl
copy autoexec.bat %windir%\1(随便找一个肯定存在的文件拷贝)
goto end
:start
预先设定的程序代码
goto end
:end
此方法对XP和98都有效!
[
Last edited by binghejin on 2007-1-22 at 03:32 PM ]
作者: zch1366
时间: 2007-1-23 04:26
谢谢8 楼.和各位
作者: zch1366
时间: 2007-1-23 04:54
@echo off
if not exist c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt echo 0 >c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt
setlocal enabledelayedexpansion
for /f %%i in (c:\%date:~0,4%%date:~5,2%%date:~8,2%.txt) do (
if "%%i"=="7" echo %%i&&exit
set /a num=%%i+1
echo !num! >c:\%date:~0,4%%date:~5,2%%date:~8,2%%.txt
set /a wj=%date:~0,4%%date:~5,2%%date:~8,2%-1
del c:\!wj!.txt
exit
)
要次数的话和运行的程序自己把 if "%%i"=="7" echo %%i&&exit改了!!
98不支持for是不?那么这个呢?
if "%%i"=="7" echo %%i&&exit 改了 if "%%i"=="3" echo %%i&&setup 不成功
if "%%i"=="7" echo %%i&&exit 改了 if "%%i"=="3" echo %%setup&&exit 不成功
我改错了吗??谢谢赐教...
作者: lotus516
时间: 2007-1-23 11:00
if "%%i"=="7" echo %%i&&exit 改了 if "%%i"=="3" echo %%i&&setup 不成功
if "%%i"=="7" echo %%i&&exit 改了 if "%%i"=="3" echo %%setup&&exit 不成功
setup,你加个路径看看!!!%%setup是一定错的!!你有setup这个变量么?给个实例更好理解!!
if "%%i"=="3" start d:\qq.exei&&exit
[
Last edited by lotus516 on 2007-1-23 at 01:08 PM ]
作者: fffcw
时间: 2007-1-23 12:13
谢谢各位的智力奉献,由于上网不多,所以没有尽早回复各位
2楼本人不是神秘,实在是水平欠佳,你们写的我基本读不懂
而且我的办法的确相当拙劣,本来爱面子不该献丑
但是从中也能看出我的死缠烂打精神
2,4,8楼的我马上试验一下,看98下可否
至于为什么非要用98,权当一个考题好了,真正会98批处的我想一定是最顶尖的高手
何况这里叫做 中国DOS联盟 ! 而不是叫 中国XP联盟 !
[
Last edited by fffcw on 2007-1-22 at 11:54 PM ]
作者: fffcw
时间: 2007-1-23 13:04
测试结果有了 8 楼的非常成功,恭喜你的了第一名,奖品到斑竹处领取
测试的代码如下:
if not exist %windir%\3 goto 2
goto start
:2
if not exist %windir%\2 goto 1
ren %windir%\2 3
goto end
:1
if not exist %windir%\1 goto jl
ren %windir%\1 2
goto end
:jl
copy c:\autoexec.bat %windir%\1
:: 上面的autoexec.bat要去掉隐藏等属性
goto end
:start
echo 按计划需要执行的程序代码
goto end
:end
但是
如果我要设定100次。。。。。。你还有更好的改进吗?
作者: fffcw
时间: 2007-1-23 13:12
恭喜4楼获得最佳创意奖,你的想法很good,但是
set Num=%Num%*
>Num.bat echo set Num=*
请说明一下意思,执行数次后Num.bat 文件里面只是" Num=* "
没有出现几个" * " 号
我改成“ set Num=%Num%* >Num.bat echo set Num=* "
不行,改成" set Num=%Num%* >Num.bat " 也不行
嗬嗬,见笑了
你还能改进吗?特等奖等着你呢
作者: fffcw
时间: 2007-1-23 13:17
2楼很遗憾
代码只在C盘建立了一个文本文件,全名是“.txt" ,点前什么也没有
setlocal enabledelayedexpansion 这句报告语法错误
后面的句子好像用到了前面的参数,所以没有单独测试
而且时间也晚了,我也是要休息滴
但是你还是获得了第三名的好成绩,加油,晚安,兄弟!
毫无疑问
你的想法也很ok,用时间进行检验再好不过了
不建立文件,直接用时间写成判断语句是不是更简洁呢?
请再试试看!
我忽然又冒出个念头,试成了一起告诉大家
夜深了,大家好梦!
[
Last edited by fffcw on 2007-1-23 at 12:25 AM ]
作者: redtek
时间: 2007-1-23 22:42
网友的代码参与和fffcw兄的主持,这个帖子既精彩又吸引人,欣赏~:)
作者: zh159
时间: 2007-1-23 23:27
Quote: |
Originally posted by fffcw at 2007-1-23 00:12:
恭喜4楼获得最佳创意奖,你的想法很good,但是
set Num=%Num%*
>Num.bat echo set Num=*
请说明一下意思,执行数次后Num.bat 文件里面只是" Num=* "
没 ... |
|
4 楼98的搞错一个地方

@echo off
if not exist c:\Num.bat >c:\Num.bat echo set Num=*
call Num.bat
if "%Num%" == "*******" goto run
>Num.bat echo set Num=%Num%*
goto end
:run
start ......
:end
exit
set Num=%Num%*
>Num.bat echo set Num=*
改为:
set Num=%Num%*
>Num.bat echo set Num=%Num%
XP下的:
@echo off
if not exist c:\Num.bat >c:\Num.bat echo set Num=1
call Num.bat
if "%Num%" == "7" goto run
set /a Num=%Num%+1
>Num.bat echo set Num=%Num%
goto end
:run
start ......
:end
exit
PS:直接用时间你根本无法判断启动次数
[
Last edited by zh159 on 2007-1-23 at 11:31 AM ]
作者: lotus516
时间: 2007-1-23 23:33
setlocal enabledelayedexpansion是启用延迟的环境变量扩展,可能98不支持,你说的不建立文件,直接用时间写成判断语句是不是更简洁呢,我认为只凭时间是不能判断次数的,最后还是要加上次数的变量!!我的可能不是最好但我的只有一个文件,而且是每天会自动清零,也就是说你即使是天天用也不用改代码也不用去删除昨天产生的垃圾,而且我的只会产生一个文件!8楼的不错,扩展性很好,但会产生很多垃圾,并且你要天天用的话你还的手动去删除昨天产生的文件夹,并且最大的弱点正如你说的如果我要设定100次。。。。。。,这个就很让人....还有这种冗长代码的效率是很低的!!四楼应该是里面最好的,但要天天用也得手动删除昨天用过的!!还有次数多*就可观了,数起次数来,嘿嘿!
楼上的set Num=%Num%+1少个参数/a吧!!
[
Last edited by lotus516 on 2007-1-23 at 11:46 PM ]
作者: qzwqzw
时间: 2007-1-24 00:20
98/DOS命令行不支持命令扩展以及其它许多cmd特性
大家可以查阅一下cmd下的多少特性是用到命令扩展的
就知道98/DOS下的批处理编程与cmd下完全不是同一范畴
-------------------------------------------------------------------------------
想试试98/DOS批处理又没有98和DOS环境的朋友
可以用XP/2003的command来模拟
因为command下的批处理语法与98/DOS基本相近
用法:开始-运行-command-批处理名
作者: zh159
时间: 2007-1-24 00:25
re:lotus516
98下set无/a /p参数,所以你2楼的98下的代码无效
楼主只说明了“开机n次后执行某一命令”,并未说明“每天”,所以没加上日期判断
另:你用日期文件名判断方式也有误:
set /a wj=%date:~0,4%%date:~5,2%%date:~8,2%-1
只要在1号这天,就会出错:20070101-1=20070100
不应该用日期名作为文件名判断,应该将日期写入固定的名称的文件内
作者: qzwqzw
时间: 2007-1-24 00:45
希望各位能明白楼主的意思
开机N次执行某一命令
与日期和时间没有任何关系
我完全可以一天之内开机N次完成条件
也可以一年开机N-1次不完成条件
所以凡是用到日期和时间的全部走了弯路
关键是在于开机次数这个数据的存取地点与存取方式
作者: zh159
时间: 2007-1-24 00:49
这是我以前写的一段
XP的可以利用自身计数的批处理,不产生另外多余的文件(当然,得手动清空计数),自己参考一下
::必须在批处理最后一行换行为空行!!!
@echo off
for /f "tokens=1,2* delims=:" %%i in ('findstr /nv "`" "%~nx0"') do set /a line=%%i-1
for /f "skip=%line% delims=" %%i in ('type "%~nx0"') do (
for %%n in (%%i) do set /a %%n+=1)
set /a :+=1
echo.&echo. 第 %:% 运行。&echo.
set/p=: <nul>>"%~nx0"
pause
exit
[
Last edited by zh159 on 2007-1-23 at 11:52 AM ]
作者: qzwqzw
时间: 2007-1-24 01:28
这是临时拼凑的一段代码
简单测试,大约可以在DOS/CMD下运行
--------------------------------------------------------
因为使用%temp%\bootnum.txt存放文件
所以喜欢开机清除垃圾文件的朋友小心了
考虑过使用当前路径
不过对于放在光盘介质和在非批处理路径下调用的情况并不合适
所以放弃
-------------------------------------------------
因为运行时必须加参数
所以喜欢直接点击执行批处理的朋友该郁闷了
参数1,指定满足执行条件的程序运行次数(放在autoexec.bat中就是启动次数)
参数2,执行条件满足后所要执行的程序,如果带参数,用引号引起
参数3,/c清除以前的运行记录,仅在条件次数超出时使用
@echo off
if #%2==# goto end
if #%3==#/c for %%f in (%temp%.\bootnum.dat*) do del %%f
echo .>> %temp%.\bootnum.dat
find "" /v /c %temp%.\bootnum.dat | find ": %1">nul
if errorlevel 1 goto end
del %temp%.\bootnum.dat
call %2
:end
作者: zch1366
时间: 2007-1-24 01:33
等待大家好消息
作者: xiaoqiangzx
时间: 2007-1-24 04:27
标题: 重啟七次運行某命令
@ECHO OFF
COUNT COUNT.TXT 7 (計算重啟開機的次數
reboot (重啟電腦的命令)
IF ERRORLEVEL 1 GOTO NG
GOTO END
: NG
echo reset fail !!!
:END
IF EXIST COUNT.TXT DEL COUNT.TXT
md xxx 建立文件夾
rd xxx 去掉文件夾
ps: count reboot 命令在論壇到處都有,給小弟在此提供下,望有用
望我們
共同努力 ̄ ̄
[
Last edited by xiaoqiangzx on 2007-1-23 at 03:40 PM ]
附件
1:
run.rar (2007-1-24 04:27, 9.13 K, 下载附件所需积分 1点
,下载次数: 5)
作者: lotus516
时间: 2007-1-24 09:54
Quote: |
Originally posted by zh159 at 2007-1-24 00:25:
re:lotus516
98下set无/a /p参数,所以你2楼的98下的代码无效
楼主只说明了“开机n次后执行某一命令”,并未说明“每天”,所以没加上日期判断
另 ... |
|
多谢zh159指点,没有考虑到每月第一天的情况!
原来command是可以模拟dos的,还以为只是cmd的英文版呢!
作者: fffcw
时间: 2007-1-24 11:43
多谢大家捧场,由于每次上来时间都比较晚了,还有些工作需要去做
所以不能逐一致谢!
综合看了一下今天的回复,其中:
1) 4楼和17楼提到的增加文本中*号个数的办法以及代码都让我这个门都没入的眼前一亮,想到过追加字符,然后判断字符数量,但是只想到基本的>>符号
"
set Num=%Num%*
>Num.bat echo set Num=%Num%
"
这样的句子对菜鸟很有教育意义
至于18楼说的"手动删除昨天用过的!!还有次数多*就可观"
可以加入自动删除的命令
*号过多的问题就要改变一下程序结构了,应该是当*号达到一定数量时比如十个,就跳转执行另一十个*号(或别的符号更好)的循环,用两个循环既可以实现20次的计数而且*号不会过多;也可以实现10X10就是100的计数,我估计对你们来说不难做到,应该是循环嵌套;当然三个循环就可以累计1000次了,这样就可以满足多数需要
[
Last edited by fffcw on 2007-1-23 at 11:58 PM ]
作者: fffcw
时间: 2007-1-24 12:03
2)
Lotus516的积极参与让帖子很活跃
你在18楼提到用时间直接判断的问题
的确时间或日期和开机次数建立起联系应该也不是简单的事情,但是适用于每天或每周只做固定开机次数的场合。比如一天只开2次,或每周只开5次等等,对于这种特定情况我想实现命题对你来说有可能比较简单(不知道98下能不能得到纯粹数字的时间字符,find应该可以做到),可以不作为讨论范围。
然而引申出我另一个问题,win98、win2000和winXP下,借用你在2楼的代码,键入"echo %date:~0,4%"得到的结果是否一样呢?win98下应该无效,win2000下,我上午试验了好像不是你的预期,需要改变其中两个数字,winXP下刚试没问题
请高手们再给点拨一下!
[
Last edited by fffcw on 2007-1-24 at 12:01 AM ]
作者: fffcw
时间: 2007-1-24 12:12
3)
谢谢zh159,你在17楼的修改,和22楼的程序,我有时间再验证
不会让你白写
23楼qzwqzw的也一样,今天没有精力试了
25楼提供的可执行程序非常8错,3Q3Q!
作者: fffcw
时间: 2007-1-24 12:46
4)我手上有一本《DOS6.22实用大全》作者Peter Norton
清华出版社出版,1996年8月第二版第三次印刷,标价70元RMB
当年这样的价格还是比较NB的
其中说到find命令的功能,能够实现在如执行dir命令后只显示指定字符以后的字符
书中举例"dir|find "free" "将会只显示磁盘剩余空间
" chkdsk|find"disk space" "将察看当前盘总容量
简单的用法不难,稍微复杂一点的应用我就不会了
我设想另一个方案:
第一次开机运行建立空文件夹下一个0号文件
第二次开机使用
dir|find "这里换成有效的字符串"
得到该文件夹内文件数1,然后建立1号文件
类推达到10个后清空文件夹,另建一个判断用的中间文件比如10号文件
以后开机仍建立0号文件,达到10个后清空文件夹
判断10文件存在建立20号文件
这样临时文件最多为10多个
至于次数的设定就不难了,仅用判断文件的存在即可
仅作咨询,高手可以给几行关键代码,不用麻烦大家作出完整程序了
比起上面的追加*号来弯子绕多了
但与我已经完成的那个笑料程序相比,这个弯绕的不够远!
把复杂搞简单相当困难,但是把简单尽可能的搞复杂就更困难!
有了个好理由,我开始得意于我的那个还没公布的大制作
论坛真不好拾道,工作人员够辛苦
都回家觉觉吧
对了,临时文件应该是必不可少的,因为要关机保存计数
只是有多有少,越高的手临时文件会尽可能少
再少也有止境,要往多里整那可是无止境的啊!继续得意。。。
不知道压缩包怎么上传
[
Last edited by fffcw on 2007-1-25 at 11:40 PM ]