批处理&VBS_JS混编(注释混编法)

我初次见到这种方法是在PCL_Test(qop_dob)兄回答别人的问题时候使用的,但是PCL斑竹却没有详细介绍这种方法,那么我来做一个整理和补充好了。
参考(bat、vbs、js 原生混编 BY CrLf斑竹)
这种神奇的混编方法与上面链接所介绍的不同,该方法的特点是可以方便的在批处理与Vbs/Js脚本间切换,而且比上面的链接的方法稍容易些。
好,让我们以VBS为例来具体看看这种方法~

'&Cls&@Echo off&Start "" Wscript -Nologo -E:Vbscript "%~0"Msgbox "Hello,world!"

将上面的例子保存为Bat或Cmd运行,再保存为Vbs或Vbe运行,结果是否一样呢?
如果读者已经亲自测试,就会发现,上面那段代码在存为批处理文件时(拓展名Bat或Vbs)会先闪一下CMD窗口,再弹出MessageBox;而存为Vbs或Vbe则会直接弹出MessageBox窗口(当Wsh默认宿主为Cscript时伴随着CMD窗口的出现,作者默认该文章的读者已经熟悉Wscript宿主和Cscript的区别,在此不再赘述)。
让我们来解读一下这些命令。
Line1:
如果拓展名为Vbs或Vbe,被解释器当作注释忽略;
如果拓展名为Bat或Cmd,则被解析为四条命令,如下:

‘Cls@Echo offStart "" Wscript -Nologo -E:Vbscript "%~0"

执行第一条命令时,由于无法找到 ’ 命令而报错。但Cmd的特殊的错误处理机制促使其忽略错误并继续执行。
执行第二条命令时,屏幕上的命令回显和错误信息被清除。
执行到第三条命令时,回显被关闭。
执行到第四条命令时,开启一个新的Wscript.EXE脚本宿主并强制将自身当Vbscript运行。
Line2:
如果拓展名为Vbs或Vbe,则执行MsgBox过程。
如果拓展名为Bat或Cmd,则由于无法找到Msgbox命令而报错,又因无指令可执行而退出。
上面的两行还可以精简为一行,如下:

Msgbox "Hello,world!" '&Cls&@Echo off&Start "" Wscript -Nologo -E:Vbscript "%~0"

这样的一行代码也可以正常执行,其原理不再赘述。
或者咱就是任性,拆分成多行:

Msgbox "Hello,world!"'&Cls&@Echo off 2>Nul 3>Nul
'&Start "" Wscript -Nologo -E:Vbscript "%~0"

这样的代码当然也可以正常执行,但有眼尖的读者可能会注意到,第二行的@Echo off后面多了个2>Nul 3>Nul,这是什么意思呢?其实就是将错误回显屏蔽掉,以便保证正常回显不被错误回显分隔开。
想要详细了解2>Nul 3>Nul的含义,请阅读普及讲解重定向。
看到这里,相信读者已经明白了注释混编法的原理了。
那么,读者可能会问了,如果Vbs和Bat要交互执行呢?
其实,也是可行的~
看下面的示例代码:

Execute Wscript.Arguments(0) '&Cls&@Echo off 2>nul 3>nul'&Echo 我是Bat
'&Pause'&Cscript -nologo -E:Vbscript "%~0" Func1
Sub Func1
    Msgbox "我是Vbs"
End Sub
'&Echo 我Bat又回来了
'&Set /p str=输入一个字符串:
'&For /f %%a in ('Cscript -Nologo -E:Vbscript "%~0" "Strlen wsh.Arguments(1)" "%Str%"') Do Set /A strlen=%%aSub Strlen(String)
    Wscript.Echo Len(String)
End Sub
'&Echo 你输入的字符串的长度是%Strlen%。
'&Echo 演示结束&Pause

需存为批处理运行。
上面的代码的流程为从上到下执行,当然Vbs语句可以放到后面去,但是为了可读性,就交错放置了。
下面来解读一下:
Line1:第一行,既有批处理命令又有Vbs语句。Vbs语句的意思是动态执行该Vbs接收到的第一个参数(即将第一个参数当语句执行)。
Line2&3:批处理命令。
Line4:批处理语句,把自身当VBS调用,并执行VBS语句:Func1。
**Line5&6&7:**Vbs语句,定义Func1。
Line8&9:批处理命令,回显、设置变量。
Line10:批处理语句,执行Vbs语句“Strlen wsh.Arguments(1)”并将批处理的Str变量传递为第二个参数,然后获取其回显。
Line11&12&13:定义Strlen函数。
Line14&15:批处理命令。
相信读者已经了解了如何交互混编了吧,这里还有PCL斑竹总结的一些混编方案,很有价值,欢迎大家研究!
参考:批处理与vbs混编如何互相传值/传递参数?

上一篇:js实现浏览器全屏与退出全屏,解决chrome下F11进入全屏后退出全屏API方法失效


下一篇:黑客整人代码,vbS整人代码大全(强制自动关机、打开无数计算器、无限循环等)