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

[数值计算] [已解决]求助:批处理运行后闪退,没有错误信息

本帖最后由 dengyuli 于 2015-2-14 19:29 编辑

问题:我做了一个可以进行实数乘法的批处理,代码有点长,花了我好长时间才打好,却运行到第一个for /f时莫名其妙的退出了(for嵌套在一个if语句中)
(已解决,以下是修改后的代码:)
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :mutiplite
  4. set cs1=%1
  5. set cs2=%2
  6. set "f=!cs1:~0,1!!cs2:~0,1!"
  7. for /l %%a in (0,1,9) do (
  8. set "f=!f:%%a=!"
  9. set f=!f: =!
  10. )
  11. set f=!f:--=!
  12. if "!cs1:~0,1!"=="-" set cs1=!cs1:~1!
  13. if "!cs2:~0,1!"=="-" set cs2=!cs2:~1!
  14. set cs1=!cs1: =!
  15. set cs2=!cs2: =!
  16. set w1eo=false & set w2eo=false
  17. set tcs1=!cs1!
  18. set tcs2=!cs2!
  19. if "!tcs1:~-1!"=="." set w1=0 & set w1eo=true
  20. if "!tcs2:~-1!"=="." set w2=0 & set w2eo=true
  21. set tcs1=!tcs1:.=!
  22. set tcs2=!tcs2:.=!
  23. set tcs1=!tcs1: =!
  24. set tcs2=!tcs2: =!
  25. if "!tcs1!"=="!cs1!" set w1=0 & set w1eo=true
  26. if "!tcs2!"=="!cs2!" set w2=0 & set w2eo=true
  27. if !w1eo!==true if !w2eo!==true set /a r=!tcs1!*!tcs2! & echo !r! & goto :eof
  28. if "!w1eo!"=="false " (
  29. for /f "delims=. tokens=1-3 usebackq" %%a in ('echo !cs1!') do (
  30. call :len %%b
  31. set w1=!zz!
  32. set cs1=!cs1:.=! & set cs1=!cs1: =!
  33. )
  34. ) else (
  35. rem meiyou
  36. )
  37. if "!w2eo!"=="false" (
  38. for /f "delims=. tokens=1-3 usebackq" %%a in ('echo !cs2!') do (
  39.    call :len %%b
  40. set w2=!zz!
  41. set cs2=!cs2:.=! & set cs2=!cs2: =!
  42.          )
  43. ) else (
  44.          rem meiyou
  45. )
  46. set w1=!w1: =!
  47. set w2=!w2: =!
  48. set /a "ttw=!w1!+!w2!"
  49. set "tcs1=" & set "tcs2="
  50. call :len !cs1!
  51. set len1=!zz! & set len1=!len1: =! & set /a len1d1=!len1!-1
  52. call :len !cs2!
  53. set len2=!zz! & set len2=!len2: =! & set /a len2d1=!len2!-1
  54. set len1=!len1: =! & set len2=!len2: =!
  55. for /l %%a in (0,1,!len1d1!) do (
  56. set "tcs1=!cs1:~%%a,1!!tcs1!"
  57. )
  58. for /l %%a in (0,1,!len2d1!) do (
  59. set "tcs2=!cs2:~%%a,1!!tcs2!"
  60. )
  61. set cs1=!tcs1! & set cs2=!tcs2!
  62. set cs1=!cs1: =!
  63. set cs2=!cs2: =!
  64. for /l %%a in (0,1,!len1d1!) do (
  65. for /l %%b in (0,1,!len2d1!) do (
  66. set /a "r%%at%%b=!cs1:~%%a,1! * !cs2:~%%b,1!"
  67. )
  68. )
  69. for /l %%a in (0,1,!len1d1!) do (
  70. for /l %%b in (0,1,!len2d1!) do (
  71.    if "!r%%at%%b:~1,1!" neq "" (
  72.       set /a bp=%%b+1
  73.       if not defined !r%%at%bp%! set r%%at%bp%=0
  74.       set /a r%%at%bp%+=!r%%at%%b:~0,1!
  75.       set r%%at%%b=!r%%at%%b:~1,1!
  76.    ) else (
  77.           rem nothing
  78.          )
  79.         )
  80. )
  81. set zz=50
  82. for /l %%a in (0,1,!len1d1!) do (
  83. set "r%%a="
  84. for /l %%b in (0,1,!len2d1!) do (
  85.   set "r%%a=!r%%a!!r%%at%%b!"
  86. )
  87. )
  88. for /l %%a in (0,1,!len1d1!) do (
  89. for /l %%b in (1,1,%%a) do (
  90. set "r%%a=0!r%%a!"
  91. )
  92. )
  93. set maxstr=0
  94. for /l %%a in (0,1,!len1d1!) do (
  95. call :len !len%%a!
  96. if !zz! gtr !maxstr! set maxstr=!zz!
  97. )
  98. set /a maxstr-=1
  99. for /l %%a in (0,1,!maxstr!) do (
  100. for /l %%b in (0,1,!len1d1!) do (
  101. set "col%%a=!col%%a! !r%%b:~%%a,1!"
  102. )
  103. )
  104. for /l %%a in (0,1,!msxstr!) do (
  105. set col%%a=!col%%a:  = !
  106. for /l %%b in (1,1,5) do (
  107. if "!col%%a:~0,1!"==" " set col%%a=!col%%a:~1!
  108. )
  109. )
  110. for /l %%a in (0,1,!maxstr!) do (
  111. set ljq=0
  112. for %%b in (!col%%a!) do (
  113.    set /a ljq+=%%b
  114. )
  115. set r%%a=!ljq!
  116. )
  117. for /l %%a in (0,1,!maxstr!) do (
  118. if "!r%%a:~1,1!" neq "" (
  119. set /a ap=%%a+1
  120.   for /l %%b in (!ap!,2,!ap!) do (
  121.       if not defined !r%%b! set r%%b=0
  122.       set /a r%%b=!r%%b!+!r%%a:~0,1!
  123.       set r%%a=!r%%a:~1,1!
  124.      )
  125.         ) else (
  126.          rem nothing
  127.         )
  128. )
  129. set /a len2p1=!len2!+1
  130. set "r="
  131. for /l %%a in (!len2p1!,-1,0) do (
  132. set /a ad=%%a-1
  133.          set ad=!ad: =!
  134. set "r=!r!!r%%a:~%ad%,1!"
  135. )
  136. for /l %%a in (1,1,30) do (
  137. if "!r:~0,1!"=="0" set r=!r:~1!
  138. )
  139. call :len !r!
  140. set lenr=!zz!
  141. if !ttw!==0 goto :eof
  142. set /a rstw=lenr-ttw
  143. set r=!r:~0,%rstw%!.!r:~-%ttw%!
  144. echo !f!!r!
  145. goto :eof
  146. :len
  147. set "str=%1"
  148. for /l %%a in (0,1,10) do (
  149. if "!str:~%%a,1!"=="" (
  150.   set "zz=%%a"
  151.   goto :eof
  152. ) else (
  153.   rem nothing
  154. )
  155. )
  156. goto :eof
复制代码
不胜感激。

木有缩进的代码简直没法看...

TOP

专治“一闪而过”的秘方:

代码里面的 @echo off 删掉
保存为 C:\test.bat
打开一个CMD窗口,执行命令:
C:\test.bat

这样可以看到详细的报错信息或者线索,以及具体哪一行代码在报错。

TOP

回复 1# dengyuli


    把最后一行的goto :eof语句去掉,就不会一闪而过

TOP

回复 3# DAIC


    它连报错信息都没有,在cmd下什么都不显示。

TOP

回复 2# CrLf


    已经添加了缩进,现在可以看了。

TOP

在命令行中运行此程序看看有什么提示。

TOP

回复 5# dengyuli


你是不是没有理解3楼的意思?
1、把 @echo off 删掉
2、不要双击执行脚本
3、不是在“运行”里面执行 C:\test.bat
4、先手工打开一个CMD窗口,然后执行 C:\test.bat

这个做法可以看到每行命令执行的回显,而不是你说的在cmd下什么都不显示

TOP

回复 8# DAIC


   嗯,确实可以。>_<
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

我是“先手工打开一个CMD窗口,然后执行 C:\test.bat”的啊,即使这样,它只显示前面几个命令,一碰到for命令就退出了,也没有错误信息。

TOP

  1. set a=1
  2. if "%a%" == "1" (echo OK) else (REM Nothing)
  3. pause
复制代码
被注释掉的部分是:Nothing)
而不是:Nothing
由于 If 语句括弧不对称,批处理异常退出

PS: 仅仅就语法而言,顶楼代码有非常多的错误,改错不如重写

TOP

回复 11# apang


    谢谢,我已经发现了,虽然现在可以计算出结果,但总是掺杂着一些无意义字符。

TOP

返回列表