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

TOP

本帖最后由 CrLf 于 2015-2-5 17:03 编辑

回复 9# Spring


    分成两个独立文件互相调用当然没问题,不过放在一起省一个步骤,写的时候不用切换窗口,用的时候也比较绿色简便
    作为批处理论坛,求助者可能默认把代码当成批处理保存,混编以后确实就是个批处理,不需要再向楼主说明这个是 .vbs 那个是 .bat,也不要求一定要保存成 外部调用.vbs 才能被认到
    你看现在论坛上几位经常发话的坛友就经常用 Bat+JS 混编,多敲两行语句,大概可以省许多口水
    纯 js 和 vbs 虽然很强大,但某些操作比较麻烦,而且这里毕竟是批处理之家,要是放眼望去全是“请保存为 .vbs”,那让人情何以堪,要是 powershell 倒是可以接受,毕竟一脉相承
----------------------------------------------------------------------------------------------------------------
    往远了说,各种脚本与批处理混编也许会成为论坛的特色,用 batcher 的话说,“批处理的圈子就屁股大”,无论是圈子里的人还是圈子里的发展空间都适用,纯批已经几乎到尽头了,那么再走下去是什么呢?
    曾和 tmplinshi 讨论过批处理的未来将是外部命令还是 vbs,我当时认为是 vbs,理由无他,便携、安全、系统自带这三大优势足以和外部命令抗衡
    但受语法所制,vbs 很难和批处理相容,即使学会了 mshta vbscript:xxxx 的用法,仍不是最好的选择
    后来,powerbat 有一阵子一直在推广 bat+js 混编,起初觉得很神奇,却没有引起注意,直到学会了 js 才开始跟着推广,当时觉得在新一代命令行 powershell 面前,这就是批处理的未来
    可惜 js 也有缺点,有些方面终究是不如 vbs 的,于是如何实现 bat+vbs 混编就成为一根心头刺,尝试过汇编修改 WScript.exe 和 CScript.exe 以兼容 bat/cmd 后缀的 WSH 文件,虽然做出来了,但终究治标不治本
    那天无意中发现(其实我是想试试看能不能用这种方式下载文件),mshta 会将 file://xxxx 里的文本内容当作 html 解析,顿时豁然开朗,bat+vbs 目前最优的混编方案原来藏在这里
    于是就发了这个帖子
----------------------------------------------------------------------------------------------------------------
    所以混编至少对批处理论坛来说还是有实用价值的
    过阵子(也许要等到春节前后),我会更新这个帖子,到时候,这个混编方案会比现在强大得多,不知道自己的想法能不能被接受,先做出来再说

TOP

与直接使用hta文件相比,这有什么好处吗?

TOP

这个要顶,期待中。

TOP

忙啊忙,放一阵,下次更新动作很大,得酝酿一下

TOP

火钳

TOP

起的这么早
期待大作。。。。。。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 CrLf 于 2015-3-6 05:57 编辑

配合批处理之家 js 在线脚本库,可扩展更多功能,详见:
http://www.bathome.net/thread-34544-1-1.html

例如模拟 WSH 环境的完整实现和第三方工具的下载:
  1. @echo off
  2. mshta "%~f0" psexec
  3. .\psexec /?
  4. pause
  5. >>>>>>>>>>
  6. <script src=http://bbs.bathome.net/lib/diy/hide.js></script>
  7. <script src=http://bbs.bathome.net/lib/diy/Tools.js></script>
  8. <script src=http://bbs.bathome.net/lib/diy/WSH.js></script>
  9. <script>Tools.get(WScript.Arguments(0))</script>
复制代码

TOP

本帖最后由 CrLf 于 2015-8-26 18:51 编辑

与 bat+js 混编的异同
bat+hta 混编 bat+js 混编
宿主mshta.exewscript.exe 或 cscript.exe
宿主对象与 <HTA:APPLICATION> 的 id 同名WSH 或 WScript
子系统GUI GUI 或 CLI
界面原生 html
实际上,如果抛掉 DOM、BOM 之类由宿主强加上去的部分,代码的基本语法是一致的(hta 加载 WSH.js 之后,就和 wscript 里的环境很像了)
mshta 比 wscript 更方便的是,它有界面(事实上它本来就是用来写桌面程序),而且可以动态加载文件(内核是 ie)
例如我用批处理之家在线 js 脚本库的 loadFirebug.js 加载一个 FireBug:
  1. <p>按 F12 调出控制台</p><script src=http://www.bathome.net/lib/diy/loadFirebug.js></script>
复制代码
这是 WScript 所做不到的

TOP

好了,我们还要消灭两个障碍~

我们知道批处理可以用 %1~%9 获取切分好的命令行参数,mshta 则没有直接的办法来获取
另一方面,mshta 是个 GUI 宿主,如果不能较好地和控制台交互,调用 mshta 将束手束脚

好在,这些都是可以解决的
-----------------------------------------------------
1、命令行参数的实现
获取 mshta 的启动参数先要创建一个 HTA:APPLICATION 标签,并设置一个 id,例如:
<HTA:APPLICATION id=mshta></HTA>

这里以 id=mshta 为例,可以用 mshta.commandLine 获取未切分的命令行参数
然后就可以按 windows 的规则来解析,例如:
  1. <script>var argv = getopts(mshta.commandLine)
  2. for(var i=0;i<argv.length;i++)alert(argv[i])
  3. function getopts(strArg){
  4.         var re = /[^"\s,;=]*"([^"]*("[^"\s,;=]*")*)*("[^"\s,;=]*|$)|[^"\s,;=]+/g
  5.         var argv = []
  6.         strArg.replace(re,function($0){argv.push($0.replace(/^"(.*)"$/g,'$1'))})
  7.         return argv
  8. }
  9. </script>
复制代码
原方案有误,现已修正了 getopts 的实现方式,正则自己写,爽爽的
示例脚本:[attach]9005[/attach]
-----------------------------------------------------
2、StdIn、StdOut、StdErr 的实现
使用 fso 控件的 GetStandardStream 方法可实现(由 terse 传授,详见原帖
得到的对象与 WScript 中的 StdIn、StdOut、StdErr 有完全相同的方法和属性,例如:
  1. <script>var fso = new ActiveXObject('Scripting.Filesystemobject')
  2. var StdIn = fso.GetStandardStream(0),
  3.      StdOut = fso.GetStandardStream(1),
  4.      StdErr = fso.GetStandardStream(2)
  5. alert(StdIn.ReadAll())
  6. StdOut.Write('标准输出测试')
  7. StdErr.Write('错误输出测试')</script>
复制代码
示例脚本:[attach]8295[/attach]

TOP

返回列表