Board logo

标题: [原创教程] 批处理之家在线 HTA 脚本 [打印本页]

作者: CrLf    时间: 2015-11-29 22:41     标题: 批处理之家在线 HTA 脚本

本帖最后由 CrLf 于 2017-3-6 10:52 编辑

_wscript.exe 支持 .bat 的 wscriptJSConsole v2.0.1 JScript控制台
再到 js/bat脚本混编新方案bat、vbs、js 原生混编批处理之家 js 在线脚本库
我一直在寻觅批处理的终极增强方案
但可惜的是鱼与熊掌不可兼得,要么操作繁琐,要么功能不够强大,有时候想“就这样了,反正只是批处理”。

一周前突然有点什么想法——其实早该想到的。
于是折腾出了这个能以最简洁的命令行调用批处理之家 js 在线脚本库的方案,集前作之所长,精巧而强大。
界面修改自在线第三方命令行工具下载

举几个实例感受一下:
  1. mshta http://bathome.net/s/hta/index.html type('UTF8编码的文件.txt')|more
  2. ::调用 type 函数自动识别文件编码,可识别 ANSI、UTF8、UTF16(即通常说的Unicode)
  3. mshta http://bathome.net/s/hta/index.html Tools.get(\"gawk\")
  4. ::调用基于 Batch-CN 第三方仓库的 Tools 库实现自动判断并下载 gawk 命令(假如 %Path% 中找不到此命令的话)
  5. ::为了提供更佳的命令行兼容性,此页面会抛弃命令行参数中未转义的 ",此例中的 \" 即代表要保留的 "
  6. ::此处的 \"gawk\" 也可写为 ""gawk"" 或 'gawk'
  7. mshta "http://bathome.net/s/hta/index.html?group=math" (new XDate()).toString(\"yyyy年MM月dd日\")
  8. ::加载 math 列表中的库,并使用 XDate 库的 toString 方法格式化输出当前日期
  9. echo msgbox "批处理之家" | mshta "http://bathome.net/s/hta/index.html?group=vbs&echo=false" VBScript(WSH.StdIn.ReadAll())
  10. ::加载 vbs 列表中的库,执行来自管道的 VBS 命令,并且不显示返回值
复制代码
当然,你也可以不调用任何函数,只执行默认库列表所能完成的命令:
  1. for /f %%a in ('mshta http://bathome.net/s/hta/index.html 12.5*3') do echo 12.5*3=%%a
复制代码
查看帮助可用 help 参数:
  1. mshta http://bathome.net/s/hta/index.html?help
复制代码
启用调试模式可用 debug 参数,在窗口中按 F12 可呼出 FireBug 控制台:
  1. mshta http://bathome.net/s/hta/index.html?debug
复制代码
如有出现运行异常的情况,可能是缓存所致,可尝试以下几种方法:
  1. 1、在 URL 后添加随机数暂时避开缓存
  2.    例如: mshta http://bathome.net/s/hta/index.html?%random%
  3.    此方法仅刷新 html 页面的缓存
  4. 2、在 IE 中按 Alt 键,工具>删除浏览历史记录,勾选“临时 Internet 文件和网站文件”,点击删除
  5.    此方法可刷新所有缓存,推荐使用,但会同时清除 IE 浏览器下其他网站的缓存
  6. 3、有经验的坛友,可以在 IE 缓存文件夹中有选择地删除缓存文件
  7.    在 IE 中按 Alt 键,工具>Internet 选项>常规>设置>Internet 临时文件>查看文件
  8.    也可以通过 mshta http://bathome.net/s/hta/index.html newcom('Shell.Application').ShellExecute(getCacheFolderPath()) 打开
复制代码
考虑到 win10 下的兼容性,建议用完整地址调用脚本 mshta http://bathome.net/s/hta/index.html "WSH.Echo('执行你的脚本')" | findstr .
作者: CrLf    时间: 2015-11-29 22:42

本帖最后由 CrLf 于 2017-3-6 10:53 编辑

请以 mshta http://bathome.net/s/hta/index.html?help 的内容为准

用法示例

WSH 库可以模拟 WSH 宿主的环境,例如:
“ mshta "http://bathome.net/s/hta/index.html" WSH.Echo('随机数:'+Math.random()) >输出.txt ”


LoadLibs 对象中用于定义要加载的可选库,配合 freshCookie() 可在命令行中修改可选库的设置,例如:
“ mshta "http://bathome.net/s/hta/index.html" LoadLibs.hide=false;freshCookie() ”


而使用 cleanCookie() 则可清除 Cookie 中的设置,例如:
“ mshta "http://bathome.net/s/hta/index.html" cleanCookie() ”



特性须知

必选库为 mshta、WSH、GetRequest 和 RunCommand,其中 WSH 依赖 批处理之家 js 在线脚本库

为提高效率,内置了一个 MiniLibs 库,只具备 Libs 库的极少量功能

使用 debug 开关后会自动调用 loadFirebug,请在加载完毕后按 F12 呼出控制台

启用 help 和 debug 开关时,不会加载 hide 库,并强制加载 Libs 库

运行结果为 undefined 或启用 echo=false 开关时,不会运行显示结果

关键函数都集成在 $Host 对象中,请不要随意篡改 $Host 的内容——除非你了解它的作用

命令行参数中的 " 除非写为 \" 或 "",否则将被抛弃

复写 " 号作为字符串标识符时,会自动对其中的 \ 转义,例如 dir(""C:\Windows\"") 相当于 dir('C:\\Windows\\')

HTA混编 用法不同的是,在 http:// 协议下权限受限,部分功能可能无法工作,例如 Adodb.Stream 的 SaveToFile



url参数语法

基本语法如 http://bathome.net/s/hta/index.html?参数1=值1&参数2=值2&参数N=值N
各项参数的功能参见下表

参数=<值>说明实例
debug调试模式,加载 loadFirebug 库并阻止 hide 库mshta http://bathome.net/s/hta/index.html?debug
//打开调试界面

mshta "http://bathome.net/s/hta/index.html" '批处理之家' >输出.txt
//WSH 库可模拟 WSH 环境,此例输出到标准输出句柄

mshta "http://bathome.net/s/hta/index.html" '批处理之家'
//无法输出到 StdOut 时,WSH.Echo 将输出到提示框

mshta "http://bathome.net/s/hta/index.html?group=vbs" msgbox('批处理之家')
//用 group 选项启用名为 'vbs' 的库列表,并调用 msgbox 函数

mshta "http://bathome.net/s/hta/index.html?load=Tools,hide" Tools.down('grep')
//用 load 选项指定仅加载 Tools 库和 hide 库,并下载 grep
help显示帮助页面并阻止 hide 库
hide=<var>var 为 false 时不加载 hide 库,否则加载
echo=<var>var 为 false 时不自动显示运行结果,否则会自动调用 WSH.Echo 进行输出
string启用 string 开关后,会先将输出调用 string 函数处理成更友好的字符串再输出
load=<var1>,<var2>,<var3>要加载的库为 <var1>、<var2>、<var3>
group=<var>未指定 load 时,将 LoadLibs 设为 <var> 对应的库列表
已指定 load 时,将以 <var> 为名的列表保存到 cookie 中
[预设列表]
default, base, vbs, string, iframe, debug, object, math, prototype, lodash, mootools, underscore, lazy, gui



Group 介绍

调用内置或自定义的组,可以快速设置 LoadLibs 为预设值,从而根据需要加载不同的库


名称:default
说明:默认列表
包含以下的库:
hide, Tools, list, Function, Prototype, DIYprototype, iconv

名称:base
说明:空列表,只加载必选库
包含以下的库:


名称:vbs
说明:加载和 VBS 相关的库
包含以下的库:
hide, vbs, VBScript

名称:string
说明:加载和字符串相关的库
包含以下的库:
hide, Function, iconv, Json2, csv, Ini, ch2num, difflib, strftime, sprintf

名称:iframe
说明:禁用 iframe 的提示,不隐藏界面
包含以下的库:
Zones0

名称:debug
说明:使用 Firebug 进行调试,不隐藏界面
包含以下的库:
loadFirebug

名称:object
说明:加载和对象相关的库
包含以下的库:
hide, Fuse, Blob, Json2, diff, naturalSort, taffy, XDate, XRegExp, typeName

名称:math
说明:加载和数字运算相关的库
包含以下的库:
hide, accounting, bignumber, numeric, numbers, moment, XDate, Math, sjcl

名称:prototype
说明:加载和 Prototype 库相关的库
包含以下的库:
hide, Function, DIYprototype, Prototype

名称:lodash
说明:加载和 lodash 库相关的库
包含以下的库:
hide, lodash

名称:mootools
说明:加载和 mootools 库相关的库
包含以下的库:
hide, mootools

名称:underscore
说明:加载和 underscore 库相关的库
包含以下的库:
hide, Underscore

名称:lazy
说明:加载和 lazy 库相关的库
包含以下的库:
hide, lazy

名称:gui
说明:加载和 GUI 相关的库,不隐藏界面
包含以下的库:
jQuery, KeyboardJS, Keypress, reveal



必选库

名称版本说明大小
GetRequestdiysrc 用于取得URL地址中的变量852Bytes
mshtadiysrc 创建一个 mshta 对象,以获取窗口信息和改变窗口形态648Bytes
RunCommanddiysrc 将接收到的命令行参数当作 js 语句来运行2KB
WSHdiysrc 模拟一个 WSH/WScript 对象5KB

作者: CrLf    时间: 2015-11-30 23:47

欢迎反馈Bug
作者: 依山居    时间: 2015-11-30 23:58

- -我是希望默认下到当前目录.
作者: CrLf    时间: 2015-12-1 00:14

回复 4# 依山居


    下载虾米?
作者: 依山居    时间: 2015-12-1 01:05

回复 5# CrLf


    Tools.get(\"gawk\") 下载到当前目录怎么改?
作者: CrLf    时间: 2015-12-1 01:42

回复 6# 依山居


get 会自动判断是否需要下载,改用 down 就好了
Tools.down(\"gawk\")

Tools.down('gawk')
Tools.down(""gawk"")
不过最新的 Tools.js 为了适应新的架构,作了很多兼容性的改进,其中有一处修改导致目前暂时无法下载文件,修复后的文件已提交给 Batcher,等站长更新后就可以正常使用 Tools.js 了
作者: pcl_test    时间: 2015-12-1 12:13

查看帮助可用 help 参数:
mshta http://bathome.net/s/hta/?help

引用时/index.html都可省略吧?

默认加载hide库可好?
比如mshta http://bathome.net/s/hta '批处理之家',要是默认加载hide库就清爽些了

Libs库可列举库列表,但缺少列举某个库都有哪些方法的功能,要查看时还需按链接查看源码,
所以要是有个方法能列举某个库的所有方法和示例那就方便多了
作者: 回家路上    时间: 2015-12-1 13:28

本帖最后由 回家路上 于 2015-12-1 13:30 编辑

希望脚本库能由此引来一度春天。

确实,要引入这个的话,感觉帮助文档使用说明就得很清楚了。----特别是转载库
虽然是开源的,但是毕竟很多人不会JS。能方便的查看说明文档最好。而且是狠多方法都有很详细的注释和用例,但是怎么方便查看?
想想工作量很大,恨我不通JS啊。

感谢奉献。
作者: CrLf    时间: 2015-12-1 14:17

本帖最后由 CrLf 于 2015-12-1 20:58 编辑

回复 8# pcl_test


回复 8# pcl_test

   
    默认加载的 default 列表中已经包含 hide 库,只是 debug 和 help 开关会暂时忽略 hide 罢了,因为此时就是需要查看界面的
    有点困难,我有尝试过解析源码获取声明的方法和属性,目前可以做到解析源码中最外层的部分,但对更复杂机制产生的内容束手无策
    我想最好的办法是笨办法,在 bathomeLibs.json 中添加每个库的方法和属性简略信息,但考虑到现在已有 65 个库…即使自写库也有 19 个之多,实在没这个精力一一写出
    事实上,bathomeLibs 中还有太多我希望能实现但没精力一一实现的库,比如注册表读写、基于 WIA 的图片格式转换还有完善的 help 机制,希望有兴趣的人能够加入,前提是和自写库格式统一、代码无害/封装合理/兼容性好/相对独立
    目前要查看有哪些方法没有提供针对库的文档,但可以列举所有方法,或查看某一个函数的注释,目前的办法是:
  1. list(this)
  2. ::查看当前所有可用的所有外围函数和变量
  3. list($Host)
  4. ::查看 $Host 对象中当前所有可用的所有外围函数和变量
  5. help(this)
  6. ::查看当前 this 所有外层函数和变量和 window 对象的所有方法和属性
  7. help(this,true)
  8. ::在前一条例子的基础上额外显示对应的类型
  9. help(help)
  10. ::查看 help 函数的入口参数
  11. help(help,true,true)
  12. ::查看 help 函数的入口参数和干净的帮助信息,所有自写库均支持此用法
复制代码
执行 help(help,true,true) 将返回以下格式:
  1. <Function> function (objArg,bShowType,bShowHelp){
  2.         //列举指定对象的方法和属性,可用于 com 组件
  3.         //依赖组件:TLI.TLIApplication
  4.         /*
  5.                 objArg  要处理的对象
  6.                 [showType]  是否显示属性
  7.                 [showHelp]  是否显示帮助信息或具体内容
  8.                 { return Array }
  9.                 例:
  10.                 help([])
  11.                 返回数组的自定义方法和属性
  12.                 help([],true,true)
  13.                 返回数组的自定义方法和属性,并注明类型和详细帮助信息
  14.         */
  15.         //部分代码修改自 http://demon.tw/programming/tli-tliapplication.html
  16.     }
复制代码
list 和 help 的用法不止于此,详见帮助
作者: CrLf    时间: 2015-12-1 14:26

http://bathome.net/s/hta/index.html
可简写为以下任意一者
http://bathome.net/s/hta/index
http://bathome.net/s/hta/
http://bathome.net/s/hta

但最后一个写法将导致读取不了 ? 及后续开关
域名则可以是 bathome 的任意一个域名
要注意的是,只要 URL 有任何变动,都将对 index.html 使用不同的缓存
作者: CrLf    时间: 2015-12-1 21:02

Bug 已修复,刷新缓存即可见效,方法见顶楼末尾部分
作者: CrLf    时间: 2015-12-1 21:09

help 函数配合 TLI 控件还可查看 COM 组件的方法和属性
不过你得在 32 位的 mshta 下才能调用 32 位的 TLI
对于 64 位组件的方法和属性,各位有什么更好的查阅方法吗?最好能通过原生组件来实现
作者: CrLf    时间: 2016-9-25 11:30

本帖最后由 CrLf 于 2016-9-26 00:46 编辑

考虑到 win10 下的兼容性,建议用完整地址调用脚本 mshta http://bathome.net/s/hta/index.html "WSH.Echo('执行你的脚本')" | findstr .
作者: yu2n    时间: 2017-3-26 00:21

本帖最后由 yu2n 于 2017-3-26 00:30 编辑

方便好用的功能,点赞!
`
举个例子:
如果要在你的互联网小程序(批处理)中加入“解压带密码的 zip 文件”功能,你可以这样做:
`
1. 创建临时目录,切换工作目录到临时目录
2. 下载 unzip.exe 到临时目录
3. 使用 unzip.exe 解压带密码的 zip 文件
`
这仅仅需要以下几行代码:
  1. @echo off
  2. :: 1. 创建临时目录,切换工作目录到临时目录
  3. md %temp%\host 2>nul & cd /d %temp%\host
  4. :: 2. 下载 unzip.exe 到临时目录
  5. mshta http://bathome.net/s/hta/index.html?echo=false "Tools.get('unzip')"
  6. :: 3. 使用 unzip.exe 解压带密码的 zip 文件
  7. unzip -o -P laod.org "windows用批处理.zip"
复制代码
`
更多的第三方命令行小程序在等着你~
`
在线第三方命令行工具  http://www.bathome.net/s/tool/index.html
`
`
作者: 老刘1号    时间: 2021-7-31 19:59

firebug原链接似乎失效了




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2