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

[原创] bat、vbs、js 原生混编

本帖最后由 CrLf 于 2015-8-23 02:22 编辑

发现 mshta 会把 file:// 协议指向的文件当作 html 来解析(注:IUnknown 与 happyxxdhaha 提醒此处必需使用绝对路径,否则不会执行),心里顿时有一万只草泥马奔过,原来如此简单的答案就在身边,却错过了四年
基本框架:
  1. <!-- : www.bathome.net
  2. @echo off
  3. echo I'm Batch!
  4. mshta "file://%~f0"
  5. pause&exit
  6. 使用注释标签囊括批处理部分,条件是批处理部分不能出现注释标签的结束符
  7. -->
  8. <script language=vbs>
  9. Msgbox "I'm VBScript!"
  10. </script>
  11. <script>
  12. alert("I'm JavaScript!")
  13. </script>
  14. <script>close()</script>
复制代码
事实上,file:// 协议名可以省略,而且如果不需要理会界面的话,完全可以不用注释标签:
  1. @echo off
  2. echo I'm Batch!
  3. mshta "%~f0" <nul
  4. pause&exit
  5. 批处理部分之后要加上一串 >,数量要比前文出现的 < 更多,mshta 才能区分哪些是标签
  6. 而且前文出现从文件获取重定向输入的时候,建议加上双引号,例如 <"script"
  7. >>>>>>>>>>>>>>
  8. <script language=vbs>
  9. Msgbox "I'm VBScript!"
  10. </script>
  11. <script>
  12. alert("I'm JavaScript!")
  13. </script>
  14. <script>close()</script>
复制代码
另一用 goto 的种写法可能更直观一点:
  1. @goto :bat
  2. <script language=vbs>
  3. Msgbox "I'm VBScript!"
  4. </script>
  5. <script>
  6. alert("I'm JavaScript!")
  7. </script>
  8. <script>close()</script>
  9. :bat
  10. @echo off
  11. echo I'm Batch!
  12. mshta "%~f0" <nul
  13. pause&exit
复制代码
要注意的是,这里的宿主是 mshta,所以不支持 WSH 宿主的方法和属性(部分属性或方法的替代方案详见后文)
但是!mshta 有嘛不好!
原生支持 setTimeout
原生支持 iframe
原生支持 dom
原生支持 javascript、vbscript 无障碍交互
原生支持 Ajax
原生支持加载外部脚本
原生支持在窗口中选择文件
原生支持复杂的页面交互
...
有这么多便利,那还计较什么呢?
首发于批处理之家
------------------------------------------------------------------------------------------------------------
关于 mshta 宿主的一些知识,参考: https://msdn.microsoft.com/en-us/library/ms536495(VS.85).aspx
感谢 xiaopo 扫盲,才知道联盟早已出现过 mshta 方案的雏形:http://cndos.fam.cx/forum/viewthread.php?tid=39655,回头上镜像站搜下,看看有没有进一步的发展
10

评分人数

    • 老刘1号: 学习了技术 + 1
    • zhanglei1371: 太强大了!技术 + 1
    • hlzj88: 强大技术 + 1
    • amwfjhh: 强大,直接把三种语言都包进来了。技术 + 1
    • xxpinqz: 为新手段喝彩,虽然看不懂。能钻研的都是好 ...技术 + 1

還有個小問題,文件要保存為bat還是html?

TOP

最近也在研究混排,在stackoverflow找了個批處理混排vbs及js的方案,就是通過wsh,可能我的需求略簡單,通過這種方式實現了目的;很早也看到過mshta的方案,但是沒仔細研究,特來研究下

TOP

回复 22# xiaopo


    原来联盟已经发明过了,膜拜,这么好的办法竟然没普及,真费解…或者说,我所熟知的 mshta vbscript:xxxxx 的写法是其最终的演化结果?
    真可惜错过了那个黄金时代,迟到七年,“原创”就成了“改良”,不过若没有来自联盟潜移默化的传承,我大概也想不到用 mshta
    事实上 mshta 输出 stdout 的方法我是从 terse 的代码中学到的,而他是联盟版主,所以这技巧有可能也是来自联盟,不知道联盟健在的时候 mshta 混编是发展到什么地步
    幸好两贴的方法和延伸略有差别,轮子造得更圆了一点

TOP

本帖最后由 xiaopo 于 2015-8-22 22:59 编辑

学习一下,在dos联盟找到一个之前的
  1. :<!--
  2. ::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::
  3. ::::::::1.执行HTML代码之前的BAT代码::::::::
  4. @echo off
  5. call :e Starting mshta...
  6. pause
  7. ::::::::1.执行HTML代码之前的BAT代码::::::::
  8. ::执行HTML代码:
  9. start mshta %0
  10. ::::::::2.执行HTML代码之后的BAT代码::::::::
  11. call :e Mshta is executing HTML codes...
  12. pause
  13. ::::::::2.执行HTML代码之后的BAT代码::::::::
  14. ::退出BAT:
  15. exit /b
  16. :::::::BAT函数定义部分:::::::
  17. :e
  18. echo %*
  19. goto :eof
  20. :::::::BAT函数定义部分:::::::
  21. ::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::
  22. -->
  23. <!--此句用来清除第一行的:-->
  24. <script>document.body.innerText=""</script>
  25. <script language=vbs>
  26. Msgbox "I'm VBScript!"
  27. </script>
  28. <script>
  29. alert("I'm JavaScript!")
  30. </script>
  31. <script>close()</script>
  32. <!--------------------------HTML-------------------------->
  33. <body onkeypress=window.close()>
  34. <hr color=red>
  35. <marquee><font color=green>HTML Codes</font></marquee>
  36. <hr color=red>
  37. <!--------------------------HTML-------------------------->
  38. <!--        BAT & HTML        {s11ss@www.cn-dos.net/forum 2008-4-22}
  39. 思路:当此文件被当作BAT文件执行时,未执行到HTML代码部分时就已退出;
  40.       当此文件被当作HTML文件执行时,BAT代码部分被注释,不会被执行。
  41. -->
复制代码
原文地址:http://cndos.fam.cx/forum/viewthread.php?tid=39655
1

评分人数

    • CrLf: 感谢扫盲!技术 + 1
http://www.bathome.net/s/tool/index.html

TOP

火        钳
活着就是为了改变世界

TOP

好贴,绝对是一种创新!省去临时文件,多种语言混写语法支持的麻烦!
代码不难,关键是给大家提供的一种范例!至少论坛中少有这种写法。
可以看出楼主有代码洁僻,精益求精!赞!

TOP

顶一下,我也要学学其它的脚本语言,还有一些工具,不能老是小打小闹。
如果能看明白你写的什么就好了。
赞赞赞。。。
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

继续测试:
  1. mshta http://batch-cn.qiniudn.com/test/测试.rar
  2. mshta http://batch-cn.qiniudn.com/test/测试.txt
  3. mshta http://batch-cn.qiniudn.com/test/测试.html
  4. mshta http://batch-cn.qiniudn.com/test/测试.js
  5. mshta http://batch-cn.qiniudn.com/test/测试.bat
  6. mshta file://D:/测试/测试.rar
  7. mshta file://D:/测试/测试.txt
  8. mshta file://D:/测试/测试.html
  9. mshta file://D:/测试/测试.js
  10. mshta file://D:/测试/测试.bat
复制代码
对比结果发现 http:// 下几种后缀名效果一致,而在 file:// 协议下 txt 不会被解析为 dom...
这是为什么呢

TOP

本帖最后由 CrLf 于 2015-3-6 14:36 编辑

回复 14# IUnknown


    同为 windows 自带的脚本宿主,wscript、cmd、powershell、regedit 都会检查后缀名,个人感觉 mshta 不看文件类型直接执行这才叫少数派呢
    mshta 也许是特殊在于第一个参数被视为 url,才没有设下这种限制
    兄台应该是 dos 联盟的前辈了,拱手一个。我介入得晚,没碰上那个黄金时代,也许无意间把前人的技术又“发明”了一次。
    不过奇怪的是,如果早就有这技术,为什么在此之前我看到 bat+vbs 混编最像样的也只有 est 的 On Error Resume Next 方案和 mshta 的 vbscript: 方案呢?前者太苛刻,后者受命令行参数长度所制,特别是如果要兼容空格还得写更长
-----------------------------------------------------------------------------------------------------------------------------------------
    非常感谢指出 %~0 的错误!之前没发现还有这问题,毕竟url地址是允许相对路径的,script 的 src 也支持相对路径,没往深处想。
    想想也是,url 的相对路径都是基于 location.href 的,那么一开始必须存在一个绝对路径作为参照
    确实是个隐患,已修改,谢谢指正
    另外,测试中发现个有趣的现象,把下面的内容分别保存为 txt、bat、hta,mshta 竟然很聪明地不把 txt 里的内容当脚本看,看起来执行前还是有检查后缀名的,不过想不明白用意何在
  1. <script>
  2. alert('haha')
  3. </script>
复制代码

TOP

没错,是应该把 "%~0" 改成 "%~f0",一般我们在资源管理器中打开一个bat/cmd的文件,%0就是完全合格的路径,等价于把一个bat/cmd文件拖到CMD窗口中一样,路径中如果有空格,就会自动加双引号。如果我要从CMD窗口中运行一个bat/cmd的文件,我一般只会输入一个文件名,那么%0就等于我输入的文件名,我如果输入一个文件名加一个扩展名,那么%0就等于文件名加一个扩展名,只有我输入绝对路径,%0才等于绝对路径。一句话,我在命令提示符中输入什么样的路径来执行bat,那么%0就等价于什么样的路径。所以,如果我要在命令提示符中运行顶楼的bat,只输入文件名,执行到mshta所在的行就会出现问题。
1

评分人数

    • CrLf: 确实如此,感谢指正!技术 + 1
Life is a balance.

TOP

"%~0" 最好用 "%~f0",因为运行bat脚本时可能是用相对路径。
而mshta的文件路径必须是绝经路径,否则进程不退出,也不执行文件内容。
%0的确切含义,好像以前某个批处理论坛有帖子分析过,可惜那个论坛貌似也关闭很久了。
批处理之家,够坚挺!
1

评分人数

    • CrLf: 确实如此,感谢指正!技术 + 1
我不知道

TOP

回复 1# CrLf


    mshta后面的第一个参数如果是文件,会当作html来解析,这不是很明显吗,为什么现在才发现呢?而且DOS联盟早就有不少类似的多语言混编的帖子,包括hta。
我不知道

TOP

帖子已更新,简化了实现方法...

TOP

回复 1# CrLf


    英文网页看不大懂

TOP

返回列表