欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

bat、vbs、js 原生混编(一个bat可以执行vbs,js代码)

程序员文章站 2022-06-17 13:30:41
发现 mshta 会把 file:// 协议指向的文件当作 html 来解析(注:iunknown 与 happyxxdhaha 提醒此处必需使用绝对路径,否则不会执行),...

发现 mshta 会把 file:// 协议指向的文件当作 html 来解析(注:iunknown 与 happyxxdhaha 提醒此处必需使用绝对路径,否则不会执行),心里顿时有一万只*奔过,原来如此简单的答案就在身边,却错过了四年

基本框架:

复制代码 代码如下:

<!-- : bathome
@echo off
echo i'm batch!
mshta "file://%~f0"
pause&exit
使用注释标签囊括批处理部分,条件是批处理部分不能出现注释标签的结束符
-->
<script language=vbs>
msgbox "i'm vbscript!"
</script>
<script>
alert("i'm javascript!")
</script>
<script>close()</script>

事实上,file:// 协议名可以省略,而且如果不需要理会界面的话,完全可以不用注释标签:

复制代码 代码如下:

@echo off
echo i'm batch!
mshta "%~f0" <nul
pause&exit
批处理部分之后要加上一串 >,数量要比前文出现的 < 更多,mshta 才能区分哪些是标签
而且前文出现从文件获取重定向输入的时候,建议加上双引号,例如 <"script"
>>>>>>>>>>>>>>
<script language=vbs>
msgbox "i'm vbscript!"
</script>
<script>
alert("i'm javascript!")
</script>
<script>close()</script>

另一用 goto 的种写法可能更直观一点:

复制代码 代码如下:

@goto :bat
<script language=vbs>
msgbox "i'm vbscript!"
</script>
<script>
alert("i'm javascript!")
</script>
<script>close()</script>
:bat
@echo off
echo i'm batch!
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 方案的雏形:,回头上镜像站搜下,看看有没有进一步的发展

复制代码 代码如下:

:<!--
::::::::::::::::::::::::::::::::bat::::::::::::::::::::::::::::::::

::::::::1.执行html代码之前的bat代码::::::::
@echo off
call :e starting mshta...
pause
::::::::1.执行html代码之前的bat代码::::::::

::执行html代码:
start mshta %0

::::::::2.执行html代码之后的bat代码::::::::
call :e mshta is executing html codes...
pause
::::::::2.执行html代码之后的bat代码::::::::

::退出bat:
exit/b

:::::::bat函数定义部分:::::::
:e
echo %*
goto :eof
:::::::bat函数定义部分:::::::

::::::::::::::::::::::::::::::::bat::::::::::::::::::::::::::::::::
-->

<!--此句用来清除第一行的:-->
<script>document.body.innertext=""</script>

<!--------------------------html-------------------------->
<body onkeypress=window.close()>
<hr color=red>
<marquee><font color=green>html codes</font></marquee>
<hr color=red>
<!--------------------------html-------------------------->

<!-- bat & html {s11ss@www.cn-dos.net/forum 2008-4-22}
思路:当此文件被当作bat文件执行时,未执行到html代码部分时就已退出;
当此文件被当作html文件执行时,bat代码部分被注释,不会被执行。
-->