无论用户尝试什么,强制VBS使用cscript而不是wscript运行的stackoverflow (因此也是正确的)方法是什么?
一个快速的谷歌搜索显示了很多例子,但其中一些根本就不起作用,而那些确实起作用的例子通常不会处理它可能与参数一起运行的事实,所以我渴望知道最好的方法是什么。
下面是一个不处理参数的例子:
sExecutable = LCase(Mid(Wscript.FullName, InstrRev(Wscript.FullName,"\")+1))
If sExecutable <> "cscript.exe" Then
Set oShell = CreateObject("wscript.shell")
oShell.Run "cscript.exe """ & Wscript.ScriptFullName & """"
Wscript.Quit
End If
我理解这可能可以很容易地修改以处理参数,但意识到这可能不是处理问题的最佳方法。
背景:我正在编写一个脚本,它可以通过双击来运行,或者(很可能)从DOS批处理文件中运行,或者作为计划任务运行。它可以包含一个或多个可选的命令行参数。
发布于 2011-03-07 20:07:55
我的主啊,多纯正的垃圾啊。看到如此粗糙的编码让我哭了(没有冒犯任何人的意思,哈哈)。不过,说真的,这是我的两便士:
Sub forceCScriptExecution
Dim Arg, Str
If Not LCase( Right( WScript.FullName, 12 ) ) = "\cscript.exe" Then
For Each Arg In WScript.Arguments
If InStr( Arg, " " ) Then Arg = """" & Arg & """"
Str = Str & " " & Arg
Next
CreateObject( "WScript.Shell" ).Run _
"cscript //nologo """ & _
WScript.ScriptFullName & _
""" " & Str
WScript.Quit
End If
End Sub
forceCScriptExecution
它处理参数,并检查这些参数中的空格--因此,如果将文件名传递给包含空格的原始脚本实例,则在传递给cscript.exe时,它不会被“标记化”。
它唯一没有做的就是测试StdIn (例如,如果有人通过命令行向脚本发送了一些东西,但是忘记使用“cscript.stdIn”) --但是如果它是由WScript.exe执行的,那么Wscript.StdIn的方法都会返回无效的句柄错误,所以无论如何都没有办法测试它。
如果有办法“打破”这一点,请随时告诉我;如果有必要,我愿意改进它。
发布于 2015-09-26 04:33:42
添加到forceCScriptExecution的两个小功能让我可以在终止后看到它的窗口并处理它的返回代码。
Sub forceCScriptExecution
Dim Arg, Str
If Not LCase( Right( WScript.FullName, 12 ) ) = "\cscript.exe" Then
For Each Arg In WScript.Arguments
If InStr( Arg, " " ) Then Arg = """" & Arg & """"
Str = Str & " " & Arg
Next
**ret =** CreateObject( "WScript.Shell" ).Run **("cmd /k** cscript //nologo """ & WScript.ScriptFullName & """ " & Str**,1,true)**
WScript.Quit **ret**
End If
End Sub
注意:"cmd /k“让窗口在执行后保留。参数"1“激活窗口。参数true等待终止,因此变量ret可以返回错误码。
发布于 2013-01-08 17:07:40
在JScript中有一个类似的方法,可以让.js文件在CScript中运行:
(function(ws) {
if (ws.fullName.slice(-12).toLowerCase() !== '\\cscript.exe') {
var cmd = 'cscript.exe //nologo "' + ws.scriptFullName + '"';
var args = ws.arguments;
for (var i = 0, len = args.length; i < len; i++) {
var arg = args(i);
cmd += ' ' + (~arg.indexOf(' ') ? '"' + arg + '"' : arg);
}
new ActiveXObject('WScript.Shell').run(cmd);
ws.quit();
}
})(WScript);
WScript.echo('We are now in CScript. Press Enter to Quit...');
WScript.stdIn.readLine();
https://stackoverflow.com/questions/4692542
复制相似问题