标题: 在另外一个程序中将脚本以变量传给cscript执行?
[打印本页]
作者: youtube2046
时间: 2009-12-19 11:46
标题: 在另外一个程序中将脚本以变量传给cscript执行?
我们通过Cscript执行vbs时一般要用如下格式:
cscript test.vbs
如果这个执行是从另外一个程序中调用的, 那么就必须把内容先写到test.vbs中。然后再执行上述代码。这样就引出一个问题:如果不希望别人看到test.vbs中的内容,那该怎么办?
假设写入test.vbs中的内容为Content. 可不可以在调用程序中以下面这种方式调用呢?
cscript Content
或者类似的方法。这样就可以保守Content中的密码了:-)
我试了不行啊。希望大家能帮我想想办法。;)
作者: qinchun36
时间: 2009-12-19 14:09
cscript和wscript都只能执行一个文件,要执行一段脚本可以用mshta
作者: youtube2046
时间: 2009-12-20 10:37
我记得mshta是执行hta格式文件的啊。既然它可以完成我说的功能,可否给出实际的实现方法。或举个例子啊?
作者: yishanju
时间: 2009-12-21 07:59
哎,自己搜索啊,真有这么难啊?
作者: qinchun36
时间: 2009-12-21 11:24
可以用如下的格式调用一句VBS脚本:
mshta vbscript:ONE_VBS_METHOD
因为 mshta 是执行 .hta 文件的,而 HTA 文件的本质就是 html 文档,因此能调用 html 文件中能够使用的脚本,但有些东西是被限制的,下面是一个在命令行窗口中执行的例子。
比如下面的一个脚本:
Set fso = CreateObject("Scripting.FileSystemObject")
temp = fso.GetSpecialFolder(2)
MsgBox "当前临时文件夹是 " & temp, 4160, "提示"
由于命令行
只能是一行,所以需要把它搞成一行的格式,冒号在VBS中做分行功能:
Set fso = CreateObject("Scripting.FileSystemObject"):temp = fso.GetSpecialFolder(2):MsgBox "当前临时文件夹是 " & temp, 4160, "提示"
又因为 mshta 被作为一个命令执行,我们的脚本只是作为参数,并且 ONE_VBS_METHOD 就
直接是运行的脚本,不能用引号,但是 mshta 又
只接受冒号后面的第一个参数,即 ONE_VBS_METHOD 必须是一个没有分隔的语句,为了解决这个问题用 execute 或者 eval 包装一下,注意变成字符串后一个引号要换成两个:
Execute("Set fso = CreateObject(""Scripting.FileSystemObject""):temp = fso.GetSpecialFolder(2):MsgBox ""当前临时文件夹是 "" & temp, 4160, ""提示""")
上面的都是合法的VBScript脚本,可以保存为 .vbs 文件直接运行的。
于是得到下面一行命令,在CMD命令行界面执行:
mshta vbscript:Execute("Set fso = CreateObject(""Scripting.FileSystemObject""):temp = fso.GetSpecialFolder(2):MsgBox ""当前临时文件夹是 "" & temp, 4160, ""提示""")
但是运行之后发现残留一个 HTA 的窗口不自动关闭,因此一般再加上一个HTML中关闭窗口的代码,变成:
mshta vbscript:Execute("Set fso = CreateObject(""Scripting.FileSystemObject""):temp = fso.GetSpecialFolder(2):MsgBox ""当前临时文件夹是 "" & temp, 4160, ""提示"":Window.Close")
多余的话:
第一句,这个其实是运行在HTML中的脚本形式,因此
还可以使用其他一些浏览器中的方法,实现脚本本身不具备的功能
mshta vbscript:Execute("x = Screen.Width:y = Screen.Height:Window.Alert ""当前显示器分辨率是 "" & x & ""×"" & y:Window.Close")
第二句,关于VBScript中的引号是个很纠结的问题,如果用JScript或者JavaScript就没这么麻烦了,因为 ' 和 " 效果相同,避免了转换时搞引号的问题,但是少了WScript、MsgBox等方便的东西
mshta javascript:eval("var fso = new ActiveXObject('Scripting.FileSystemObject');var temp = fso.GetSpecialFolder(2);window.alert('当前临时文件夹是 ' + temp);window.close()");
(不建议新手或者对大小写不敏感者使用JScript或者JavaScript!)