bat、vbs、js 原生混编(一个bat可以执行vbs,js代码)
发现mshta会把file://协议指向的文件当作html来解析(注:IUnknown与happyxxdhaha提醒此处必需使用绝对路径,否则不会执行),心里顿时有一万只草泥马奔过,原来如此简单的答案就在身边,却错过了四年
基本框架:
<!--:bathome @echooff echoI'mBatch! mshta"file://%~f0" pause&exit 使用注释标签囊括批处理部分,条件是批处理部分不能出现注释标签的结束符 --> <scriptlanguage=vbs> Msgbox"I'mVBScript!" </script> <script> alert("I'mJavaScript!") </script> <script>close()</script>
事实上,file://协议名可以省略,而且如果不需要理会界面的话,完全可以不用注释标签:
@echooff echoI'mBatch! mshta"%~f0"<nul pause&exit 批处理部分之后要加上一串>,数量要比前文出现的<更多,mshta才能区分哪些是标签 而且前文出现从文件获取重定向输入的时候,建议加上双引号,例如<"script" >>>>>>>>>>>>>> <scriptlanguage=vbs> Msgbox"I'mVBScript!" </script> <script> alert("I'mJavaScript!") </script> <script>close()</script>
另一用goto的种写法可能更直观一点:
@goto:bat <scriptlanguage=vbs> Msgbox"I'mVBScript!" </script> <script> alert("I'mJavaScript!") </script> <script>close()</script> :bat @echooff echoI'mBatch! mshta"%~f0"<nul 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,回头上镜像站搜下,看看有没有进一步的发展
:<!-- ::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::
::::::::1.执行HTML代码之前的BAT代码:::::::: @echooff call:eStartingmshta... pause ::::::::1.执行HTML代码之前的BAT代码::::::::
::执行HTML代码: startmshta%0
::::::::2.执行HTML代码之后的BAT代码:::::::: call:eMshtaisexecutingHTMLcodes... pause ::::::::2.执行HTML代码之后的BAT代码::::::::
::退出BAT: exit/b
:::::::BAT函数定义部分::::::: :e echo%* goto:eof :::::::BAT函数定义部分:::::::
::::::::::::::::::::::::::::::::BAT:::::::::::::::::::::::::::::::: -->
<!--此句用来清除第一行的:--> <script>document.body.innerText=""</script>
<!--------------------------HTML--------------------------> <bodyonkeypress=window.close()> <hrcolor=red> <marquee><fontcolor=green>HTMLCodes</font></marquee> <hrcolor=red> <!--------------------------HTML-------------------------->
<!--BAT&HTML{s11ss@www.cn-dos.net/forum2008-4-22} 思路:当此文件被当作BAT文件执行时,未执行到HTML代码部分时就已退出; 当此文件被当作HTML文件执行时,BAT代码部分被注释,不会被执行。 -->