Board logo

标题: [其他] 【已解决】请教批处理for循环in内的命令长度是否有上限,如何解决? [打印本页]

作者: xiaolijian916    时间: 2021-8-6 17:20     标题: 【已解决】请教批处理for循环in内的命令长度是否有上限,如何解决?

本帖最后由 xiaolijian916 于 2021-8-10 21:29 编辑

执行代码是: mshta "about:<hta:application scroll=no border=thin maximizeButton=no minimizeButton=no showintaskbar=no />!html!
!html! 这段内容特别长,合并一行了之后html字符总数7千多...

伪代码:
  1. set htatxt='mshta "about:<hta:application scroll=no border=thin maximizeButton=no minimizeButton=no showintaskbar=no />!html!"'
  2. for /f "tokens=1,2 delims=^=" %%a in (!htatxt!) do (
  3.    REM 如果命令过长for循环不会执行吗?经过测试删减!Html!代码量会执行in内部的命令,有何办法解决代码量过长导致不能执行的问题?
  4.     REM 尝试将!htatxt! 写入到文件中再读取出来(代码已压缩一行)还是不执行。。。。
  5.     REM todo
  6. )
复制代码

作者: idwma    时间: 2021-8-6 20:52

放在里面有些符号是要转义的
试试单执行出结果后,只把结果放进去如果可以的话
作者: xiaolijian916    时间: 2021-8-6 22:01

放在里面有些符号是要转义的
试试单执行出结果后,只把结果放进去如果可以的话
idwma 发表于 2021-8-6 20:52



    应该不是转义问题,html代码量不多的情况下能执行到内部,一旦html字符过多就不执行了。
作者: idwma    时间: 2021-8-6 22:16

本帖最后由 idwma 于 2021-8-6 22:25 编辑

像这样?
  1. <!-- ::
  2. @echo off
  3. for /f "delims=" %%a in ('mshta.exe "%~f0"') do
  4. goto :eof
  5. -->
  6. <hta:application scroll=no border=thin maximizeButton=no minimizeButton=no showintaskbar=no />
复制代码

作者: xiaolijian916    时间: 2021-8-6 23:23

像这样?
idwma 发表于 2021-8-6 22:16



    变个法执行原理没变,效果一样的。PS:怎么上传图片,图片看一下就明白怎么情况。
作者: xiaolijian916    时间: 2021-8-6 23:48

本帖最后由 xiaolijian916 于 2021-8-10 14:57 编辑

以下原示例代码,!tr!行记录不超于5行时,页面正常弹出,大于5行页面未弹出(怀疑是拼接过长导致无法执行)
  1. REM ----------------------------------------------------------------------------------------->【清理过时的无线网络连接信息(采用hta构建方式实现)】
  2. :clear-wlan
  3. ECHO 清理完毕
  4. REM 【第二种】说明:hta=HTML Application简写,意为HTML页面应用程序,扩展性极强【弹窗未居中,需计算中心坐标】
  5. REM 自定义函数脚本封装
  6. set script="<script type='text/javascript'> window.resizeTo(800,500);window.moveTo((!xpixels!-800)/2,(!ypixels!-500)/2); "
  7. set script=!script!"function cls(){
  8. set script=!script!" var wifi = document.getElementsByName('wifi');"
  9. set script=!script!" var msg = "", array = [];"
  10. set script=!script!" for(var i = 0; i < wifi.length; i++){"
  11. set script=!script!" if(wifi[i].checked) {"
  12. set script=!script!" array.push(wifi[i].value);"
  13. set script=!script!" msg += ('【'+ wifi[i].sn + '】- ' + wifi[i].value + '\r');"
  14. set script=!script!" }"
  15. set script=!script!" }"
  16. set script=!script!" if(array.length == 0){"
  17. set script=!script!" alert('请至少选择一项');"
  18. set script=!script!" }else{"
  19. set script=!script!" var rs = confirm('您选中【'+ array.length +'】项分别是:\r-----------------------\r'+ msg +'-----------------------\r★ 此操作无法撤销,请您再次确认!');"
  20. set script=!script!" if(rs == true){"
  21. set script=!script!" new ActiveXObject('Scripting.FileSystemObject')).GetStandardStream(1).Write(array.join('&');close();"
  22. set script=!script!" }"
  23. set script=!script!" }"
  24. set script=!script!"}"
  25. set script=!script!"</script>"
  26. REM 页面样式封装
  27. set style="<style> body {font-family:微软雅黑} "
  28. set style=!style!"input[type=button] {background-color:#3399FF;border:0px;color:#FFFFFF;width:100px;height:35px;margin-left:30px;margin-right:30px;font-size:15px;font-weight:800;}; "
  29. set style=!style!"tr {height:30px;background-color:#CCFFFF}; tr.row {font-size:15px;font-weight:800;color:#FFFFFF;background-color: #3399FF}; td.sn {width:70px}; "
  30. set style=!style!"</style>"
  31. REM 表格内容封装
  32. set table="<table style='border:1px solid #3399FF;width:700px;' cellspacing='0'>"
  33. set table=!table!"<tr class=row>"
  34. set table=!table!" <td class='sn'>&nbsp;序号</td>"
  35. set table=!table!" <td>名称</td>"
  36. set table=!table!" <td>口令</td>"
  37. set table=!table!" <td class='sn'>&nbsp;序号</td>"
  38. set table=!table!" <td>名称</td>"
  39. set table=!table!" <td>口令</td>"
  40. set table=!table!"</tr>"
  41. REM 动态拼装行记录(数据量!tr!=50行左右)
  42. set table=!table!!tr!
  43. set table=!table!"<tr style='height:65px'>"
  44. set table=!table!" <td colspan=6 align='center' style='border:0px solid red'>"
  45. set table=!table!" <hr style='color:#3399FF;height:1px;'>"
  46. set table=!table!" <input type='button' value='清 理' onclick='cls()'>"
  47. set table=!table!" <input type='button' value='取 消' onclick='close()'>"
  48. set table=!table!" </td>"
  49. set table=!table!"</tr>"
  50. set table=!table!"</table>"
  51. REM 构建完整页面
  52. set htatxt="<title>清理无线网络连接历史记录</title>&nbsp;&nbsp;&nbsp;"
  53. set htatxt=!htatxt!!script!!style!!table!
  54. set htatxt=!htatxt:"=!
  55. REM set table=!table:"=!
  56. ECHO !htatxt!
  57. REM 封装将多行文本拼接为一行,增强可读性及易维护
  58. set htatxt='mshta "about:<hta:application scroll=no border=thin maximizeButton=no minimizeButton=no showintaskbar=no />!htatxt!"'
  59. REM echo !htatxt! >htatxt.txt
  60. set pname=
  61. set pvalue=
  62. for /f "tokens=1,2 delims=^=" %%a in (!htatxt!) do (
  63. REM 根据页面操作返回数据执行后续业务逻辑代码
  64. )
复制代码

作者: cmd1152    时间: 2021-8-7 10:10

回复 6# xiaolijian916


    <和>、=、/的转义问题
作者: xiaolijian916    时间: 2021-8-7 11:23

回复 7# cmd1152


    不是特殊符号问题,html代码量过多导致的问题。我想知道怎么处理这种代码量过大的hta程序
作者: cmd1152    时间: 2021-8-7 12:21

回复 8# xiaolijian916


    >在批处理中不会被认为是字符串(加"也没有用),除非在他的前面加^
作者: xiaolijian916    时间: 2021-8-7 14:54

回复 9# cmd1152


    我楼上说了呀,不是特殊符号引起的问题,如果是那为什么代码量少的时候就能运行。。。
作者: cmd1152    时间: 2021-8-7 16:10

回复 10# xiaolijian916


    试试这个
  1. set htatxt='mshta "about:^<hta:application scroll^=no border^=thin maximizeButton^=no minimizeButton^=no showintaskbar^=no ^/^>!html!"'
  2. for /f "tokens=1,2 delims=^=" %%a in (!htatxt!) do (
  3. )
复制代码

作者: xiaolijian916    时间: 2021-8-7 19:19

真不是特殊符号引起的异常,如果异常,批处理直接闪退了。况且前面解释了很多遍,命令不长的时候是能够打开HTML页面的,并且显示正常。只有当HTML代码过长就不显示,直接跳过for循环返回了
作者: xiaolijian916    时间: 2021-8-7 19:20

本帖最后由 xiaolijian916 于 2021-8-7 19:21 编辑

图片地址:https://photo.weibo.com/34732307 ... 8fzq88rpj20n20b30tb
作者: xiaolijian916    时间: 2021-8-7 19:42

回复 11# cmd1152


    请看我的最新回复
作者: cmd1152    时间: 2021-8-7 20:46

回复 14# xiaolijian916


    那我就不知道了...
作者: xiaolijian916    时间: 2021-8-7 21:54

有人遇到类似的情况吗,网上找不到案例。求助
作者: xiaolijian916    时间: 2021-8-8 20:06

前辈们给个建议,像这种情况是不能解决吗,还是需要额外处理。
作者: xiaolijian916    时间: 2021-8-10 19:36

解决了:还是mshta写法问题。应该是 ’mshta "当前目录\*.hta"‘ 就可以了。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2