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

[原创] 批处理&VBS|JS混编(注释混编法)

本帖最后由 老刘1号 于 2018-1-30 20:00 编辑

我初次见到这种方法是在PCL斑竹回答别人的问题时候使用的,但是PCL斑竹却没有详细介绍这种方法,那么我来做一个整理和补充好了。
参考(bat、vbs、js 原生混编 BY CrLf斑竹)
这种神奇的混编方法与上面链接所介绍的不同,该方法的特点是可以方便的在批处理与Vbs/Js脚本间切换,而且比上面的链接的方法稍容易些。
好,让我们以VBS为例来具体看看这种方法~
  1. '&Cls&@Echo off&Start "" Wscript -Nologo -E:Vbscript "%~0"
  2. Msgbox "Hello,world!"
复制代码
将上面的例子保存为Bat或Cmd运行,再保存为Vbs或Vbe运行,结果是否一样呢?
如果读者已经亲自测试,就会发现,上面那段代码在存为批处理文件时(拓展名Bat或Vbs)会先闪一下CMD窗口,再弹出MessageBox;而存为Vbs或Vbe则会直接弹出MessageBox窗口(当Wsh默认宿主为Cscript时伴随着CMD窗口的出现,作者默认该文章的读者已经熟悉Wscript宿主和Cscript的区别,在此不再赘述)。
让我们来解读一下这些命令。
Line1:
如果拓展名为Vbs或Vbe,被解释器当作注释忽略;
如果拓展名为Bat或Cmd,则被解析为四条命令,如下:
  1. Cls
  2. @Echo off
  3. Start "" Wscript -Nologo -E:Vbscript "%~0"
复制代码
执行第一条命令时,由于无法找到 ' 命令而报错。但Cmd的特殊的错误处理机制促使其忽略错误并继续执行。
执行第二条命令时,屏幕上的命令回显和错误信息被清除。
执行到第三条命令时,回显被关闭。
执行到第四条命令时,开启一个新的Wscript.EXE脚本宿主并强制将自身当Vbscript运行。
Line2:
如果拓展名为Vbs或Vbe,则执行MsgBox过程。
如果拓展名为Bat或Cmd,则由于无法找到Msgbox命令而报错,又因无指令可执行而退出。
上面的两行还可以精简为一行,如下:
  1. Msgbox "Hello,world!" '&Cls&@Echo off&Start "" Wscript -Nologo -E:Vbscript "%~0"
复制代码
这样的一行代码也可以正常执行,其原理不再赘述。
或者咱就是任性,拆分成多行:
  1. Msgbox "Hello,world!"
  2. '&Cls&@Echo off 2>Nul 3>Nul
  3. '&Start "" Wscript -Nologo -E:Vbscript "%~0"
复制代码
这样的代码当然也可以正常执行,但有眼尖的读者可能会注意到,第二行的@Echo off后面多了个2>Nul 3>Nul,这是什么意思呢?其实就是将错误回显屏蔽掉,以便保证正常回显不被错误回显分隔开。
想要详细了解2>Nul 3>Nul的含义,请阅读普及讲解重定向
看到这里,相信读者已经明白了注释混编法的原理了。
那么,读者可能会问了,如果Vbs和Bat要交互执行呢?
其实,也是可行的~
看下面的示例代码:
  1. Execute Wscript.Arguments(0) '&Cls&@Echo off 2>nul 3>nul
  2. '&Echo 我是Bat
  3. '&Pause
  4. '&Cscript -nologo -E:Vbscript "%~0" Func1
  5. Sub Func1
  6.     Msgbox "我是Vbs"
  7. End Sub
  8. '&Echo 我Bat又回来了
  9. '&Set /p str=输入一个字符串:
  10. '&For /f %%a in ('Cscript -Nologo -E:Vbscript "%~0" "Strlen wsh.Arguments(1)" "%Str%"') Do Set /A strlen=%%a
  11. Sub Strlen(String)
  12.     Wscript.Echo Len(String)
  13. End Sub
  14. '&Echo 你输入的字符串的长度是%Strlen%。
  15. '&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混编如何互相传值/传递参数?
1

评分人数

    • bbaa: 6666666666666666666666666666666666666666技术 + 1

学习了,飘过

TOP

返回列表