[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】关于bat call的用法以及goto自动退出以及弹窗的问题

本帖最后由 Linux9253 于 2015-7-23 13:43 编辑

问题一:
  1. call :ctime %Systime%.00 %Localtime% t
  2. :ctime <begin_time> <end_time> <return>  
  3. setlocal
  4. for /f "tokens=1-6 delims=:" %%a in ("%1:%2")do ( set/a "sm=2%%e-1%%b,ss=2%%~nf-1%%~nc")
  5. if %ss% lss 100 set/a ss+=60,sm-=1
  6. if %sm% lss 100 set/a sm+=60,sh-=1
  7. set F=%sm:~-2% & set M=%ss:~-2%
  8. if %M:~0,1% == 0 (set M=%M:~1%) else (set M=%M%)
  9. if %F:~0,1% == 0 (set F=%F:~1%) else (set F=%F%)
  10. endlocal&set /a %3=%F%*60+%M%
  11. if %t% gtr 15 echo # > %hqlopwd%\count.log & start "cmd /c" %0 && exit
复制代码
上面是代码的一部分/是计算两个时间差的,也可一正常运行,问题出在最后一句的后面,“%0”,
本来我是想当条件达到里就重新打开一个新的“自己”,然后退出老的“自己”,但但加上这段代码之后就不行了,
提示找不到ctime文件,这个时候%0可能还是ctime函数的环境吧,求大神帮忙解决,当然也可以重新写一个计算时间差的脚本,
最好不要用延迟变量。

问题二:   重点
这是又一个问题,脚本是goto实现的循环,但不知到为什么总会自动结束,出现下面信息,请问这是什么情况。
脚本太大,goto太多,所以就不贴代码了,
******  B A T C H   R E C U R S I O N  exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
******       B A T C H   PROCESSING IS   A B O R T E D      ******

问题三:
  1. set j=0 & type %Errlog% | findstr /i "警告: 警告:">nul && (color 4e &for /f "delims=" %%i in (%Errlog%) do (
  2. set /a j+=1
  3. set con!j!=%%i
  4. call set a=%%con!j!%%
  5. start %Localpwd%\ring.vbs
  6. MSG %username% /time:5   !a!  
  7. color 4e&ping 127.1>nul
  8. goto start
复制代码
脚本把收集过来的错误信息导出到指定文件,然后检测文件里是否有错误信息,有的话就把里面的错误信息以弹窗的形式
展示出来,如果文件里只有一行错误信息,上面这段代码是可以的正确弹出信息的,但如果有多行的话,会先弹出第一行,
等第一行关闭了,才会弹出下一行,一次类推。。。求大神帮忙,怎么一下子弹出来多行,并且要加上换行的效果。
听说这么世界很美好、好多人都会帮我。。。

1.
直接用goto返回就行了,何必要绕个大弯子重开
还有你的代码又没用到变量延迟...
2.
递归次数达到极限,检查代码中是否多次call/%0
3.
  1. set CrLf=^
  2. set j=0
  3. type %Errlog% | findstr /i "警告: 警告:">nul && (
  4. color 4e
  5. for /f "delims=" %%i in (%Errlog%) do (
  6. set /a j+=1
  7. set con!j!=%%i
  8. call set a=%%con!j!%%
  9. start %Localpwd%\ring.vbs
  10. set Mes=!a!!CrLf!!Mes!
  11. )
  12. MSG %username% /time:5 "!Mes!"
复制代码
PS 别动那两个空行

TOP

回复 2# bailong360


    你好/非常感谢你的回复,
问题一:
环境因素,就算goto到开头,也解决不了问题,解释起来比较复杂,重新开始是最好的办法,

问题二:
整个bat中只有一处call,就是上面问题一里的那个,刚才我百度了下,大概明白怎么回事,但没找到解决办法,
请问假如goto循环一定次数退出重新开始,能解决问题嘛?

问题三:
这么晚回复就是因为我刚才一直在测试你给的代码,只是可惜,可能是环境不同吧,一直测试不成功,
闪退,一直没有找到问题的所在,我用的虚拟机做的实验,难道是我的环境问题? 看来我的水平还不是一般的差啊。哈哈
听说这么世界很美好、好多人都会帮我。。。

TOP

个人经验,只有 call 会导致这样的警报

TOP

回复 3# Linux9253
1.
2.
  1. call :ctime 13:00:00.00 13:02:25.22 t
  2. if %t% gtr 15 echo # > %hqlopwd%\count.log & start "cmd /c" %0 && exit
  3. :ctime <begin_time> <end_time> <return>  
  4. setlocal
  5. for /f "tokens=1-6 delims=:" %%a in ("%1:%2")do ( set/a "sm=2%%e-1%%b,ss=2%%~nf-1%%~nc")
  6. if %ss% lss 100 set/a ss+=60,sm-=1
  7. if %sm% lss 100 set/a sm+=60,sh-=1
  8. set F=%sm:~-2% & set M=%ss:~-2%
  9. if %M:~0,1% == 0 (set M=%M:~1%) else (set M=%M%)
  10. if %F:~0,1% == 0 (set F=%F:~1%) else (set F=%F%)
  11. endlocal&set /a %3=%F%*60+%M%
  12. goto :eof
复制代码
话说我这里没有提示找不到ctime
3.
最后那个')'改成'))'

TOP

回复 2# bailong360


大神、上图是代码运行的情况、测试环境是win7,能帮忙看下嘛
听说这么世界很美好、好多人都会帮我。。。

TOP

回复 6# Linux9253
第一行加上
setlocal enabledelayedexpansion

TOP

回复 7# bailong360


    厉害啊、非常感谢、可以啦、完全符合要求、再次感谢
听说这么世界很美好、好多人都会帮我。。。

TOP

回复 2# bailong360


    顺便说一下,那是 Lf,不含 Cr

TOP

回复 9# CrLf


  谢谢大神的指点、上面的代码可以实现弹窗多行显示了、还有、能帮我看下这个问题嘛、  http://www.bathome.net/thread-36615-1-1.html
听说这么世界很美好、好多人都会帮我。。。

TOP

本帖最后由 aa77dd@163.com 于 2015-7-23 16:24 编辑

就是, 楼上滴楼上早已申请ZL, 再有仿冒, 侵犯肖像权 一定打 PP, KAKA

TOP

回复 9# CrLf
受教了

TOP

返回列表