找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 56104|回复: 11

[分享]批处理调用mshta执行vbs代码的方法

[复制链接]
发表于 2011-3-20 03:39:07 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-7-18 20:15 编辑

本文为原创。把这里的代码直接复制到cmd窗口运行就可以了。
mshta是用来解释hta程序的,或者叫hta程序的宿主。而hta程序其实就是html文件。所以你只要输入html标签就可以了。这是标准用法,其它的用法太乱。在cmd中输入下面的文字:


  1. mshta vbscript:"<html style=background:buttonface><title>作者:myzam 2011-3-18</title><body>hello world<br/>hello<hr/>world<script language=vbscript>msgbox (123)</script></body></html>"
复制代码
引号中再来引号怎么办?

mshta vbscript:"msgbox ("hello world")"
这样用会报错。解决的办法是采用双双引号。也就是说看实例:

  1. mshta vbscript:"<html ><title>test</title><body>hello world <script language='vbscript'>msgbox (""hello world"") </script></html>"
复制代码
注意这两句的细微差别。它们都能成功执行。
  1. mshta vbscript:"<html ><title>test</title><body>hello world <script language=""vbscript"">msgbox (""hello world"") </script></html>"
复制代码
如果你不喜欢那个弹出的hta窗口,那就加一句话window.close或self.close
  1. mshta vbscript:"<html ><title>myzam</title><body>hello world <script language=""vbscript"">msgbox (""hello world""):windwo.close </script></html>"
复制代码
如果你要注释掉脚本中的语句也好办,看代码:
  1. mshta vbscript:"<html ><title>myzam</title><body>hello world <script language=""vbscript"">msgbox (""hello world""):'windwo.close </script></html>"
复制代码
就这么简单。
如果你怀疑这种标准用法,就在看一个脚本吧
  1. mshta vbscript:"<script language=vbs>set myzam=createobject(""sapi.spvoice""):myzam.speak ""hello world 日本地震了啊""</script>"
复制代码
按这种标准写法,你想在cmd中写多长的脚本都可以,但是我想没人喜欢在cmd中写那种长脚本。当然以此为依据可以简化在cmd 中的输入,比如标签<html>可以不写出来等等。
如果要在bat中运行vbs我想这是一种比较自然的方法。下面给出一个bat程序
  1. @echo off
  2. cmd /c mshta vbscript:"<script language='vbscript'>msgbox (""hello

  3. world""):self.close</script>"
复制代码
其实,上面的bat根本就不需要cmd /k,直接保存为bat 点击就可以运行。这与其它的
bat有这么一点细微的差别。
  1. @echo off
  2. mshta vbscript:"<script language='vbscript'>msgbox (""hello

  3. world""):self.close</script>"
复制代码
最后:1#####hta文件的宿主----mshta
                      html的宿主-----IE
                      VBS的宿主----wscrit
                      asp的宿主----IIS
                      BAT的宿主---cmd
                      vba的宿主是---office
         2#####mshta语法
         vbs脚本时
            mshta vbscript:"html标签"
         js脚本时
            mshta jscript:"html标签"
          说明:第一,不要换行
                   第二,标签属性可以用单引号,也可以不用引号,如果要用双引号,那么  双引号请该为双双引号
                   第三,遇到字符串,请用双双引号。
                   第四,如果要从参数的角度讲的话,mshta后面的都可以叫参数。
                     事实上mshta后面的就是参数。

总之,玩mshta命令就是玩的是html标签。
good luck!


--------------------------------------------------
可接受环境变量

  1. @echo off
  2. set t="<script language=vbs>msgbox 123:self.close</script>"
  3. mshta vbscript:%t%
复制代码
到此,在bat中使用vbs得到了完全解决。从此可以在bat和vbs间自由的航行了。

评分

参与人数 3技术 +3 收起 理由
0000 + 1 感谢分享
zm900612 + 1 多谢分享
wc726842270 + 1 学习,学习

查看全部评分

发表于 2011-3-20 09:00:33 | 显示全部楼层
关于引号可能是经过的处理次数吧,在引号内的内容可以看作一个整体,每次处理都需要脱去一层(这仅是个人的薄见)
不过想请教一下MSHTA的参数,
 楼主| 发表于 2011-3-20 09:49:54 | 显示全部楼层
mshta 说真的我从来没看到过它的说明文档。说以它的参数,我也不知道。如果要说有的话,那就是这样的一个格式:
  mshta vbscript: " 这里写入html文本,但不要换行  "
   mshta jscript:"   这里写入html文本   "
这么写也是我自己从宿主的角度想出来的。
发表于 2011-3-20 10:13:30 | 显示全部楼层
3# myzam
多谢,你的回答。我也仅仅是出于好奇而以,在看博客时也仅发现一个参数,但因为感到其不全,所以也没细看(而且单词还不好背)。现在一想,真是悔啊
发表于 2011-3-20 11:43:57 | 显示全部楼层
双引号的转义是不是和%的转义差不多呢?
 楼主| 发表于 2011-3-20 11:54:25 | 显示全部楼层
本帖最后由 myzam 于 2011-3-20 11:56 编辑

我认为这不是转义。
应该是起到字符串连接的作用。
"a""b"
其实,只要有双双引号就足够用了。
我记得在cmd中我们爱讨论 echo %%%%%abc%%%%%
但在编程中我们都不会这么去用。
发表于 2017-5-20 19:49:24 | 显示全部楼层
window.close 和 self.close 到底有什么区别?
百度了几圈都没找到答案,别说都一样
发表于 2017-5-20 20:23:58 | 显示全部楼层
回复 7# 不知道是谁


    window.self、window.top、window 一般来说是指向同一个对象(除非在框架中)
同时,因为默认情况下 window 是变量作用域,所以 window.self 可以简写 self
所以一般来说这几个是一样的:
  1. window.close
  2. window.top.close
  3. window.self.close
  4. top.close
  5. self.close
  6. close
复制代码
但是如果你用了框架,比如 iframe,那子框架中的 window 就是它自己,而 top 则是指最顶级窗口的 window

评分

参与人数 2技术 +2 收起 理由
happy886rr + 1 666
codegay + 1 1

查看全部评分

发表于 2018-11-10 17:59:54 | 显示全部楼层
本帖最后由 kaze 于 2018-11-11 13:31 编辑

回复 8# CrLf
请问如何把变量%num%传入vbs代码内呢?
感谢zaqmlp已解决该问题!
zaqmlp 2018-11-11 12:54  NEW
<!-- :
@echo off
:Main
set num=
set /p num=输入(数字):
if not defined num goto Main
echo;%num%|mshta "%~f0"
exit
-->

<script>
var fso = new ActiveXObject("Scripting.FileSystemObject");
var StdIn = fso.GetStandardStream(0);
var StdOut = fso.GetStandardStream(1);
var list=StdIn.ReadLine();
var url = "http://music.taihe.com/album/"+list+"/";
alert(url);
close();
</script>
发表于 2019-5-19 18:38:55 | 显示全部楼层
因为ren要改,所以要关闭文件夹1句,然后再打开之前的关闭文件夹1句,mshta vbscript给高手写下
发表于 2019-5-19 19:44:17 | 显示全部楼层
或者通过BJ混排,直接把js脚本写到批处理里面。同样能达到类似目的。
发表于 2022-6-12 13:22:38 | 显示全部楼层
math只能调用 html和vbs吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:08 , Processed in 0.020893 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表