我初次见到这种方法是在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混编如何互相传值/传递参数?