首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >强制使用cscript而不是wscript运行VBS

强制使用cscript而不是wscript运行VBS
EN

Stack Overflow用户
提问于 2011-01-14 23:16:23
回答 4查看 34.4K关注 0票数 19

无论用户尝试什么,强制VBS使用cscript而不是wscript运行的stackoverflow (因此也是正确的)方法是什么?

一个快速的谷歌搜索显示了很多例子,但其中一些根本就不起作用,而那些确实起作用的例子通常不会处理它可能与参数一起运行的事实,所以我渴望知道最好的方法是什么。

下面是一个不处理参数的例子:

代码语言:javascript
复制
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批处理文件中运行,或者作为计划任务运行。它可以包含一个或多个可选的命令行参数。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-07 20:07:55

我的主啊,多纯正的垃圾啊。看到如此粗糙的编码让我哭了(没有冒犯任何人的意思,哈哈)。不过,说真的,这是我的两便士:

代码语言:javascript
复制
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的方法都会返回无效的句柄错误,所以无论如何都没有办法测试它。

如果有办法“打破”这一点,请随时告诉我;如果有必要,我愿意改进它。

票数 22
EN

Stack Overflow用户

发布于 2015-09-26 04:33:42

添加到forceCScriptExecution的两个小功能让我可以在终止后看到它的窗口并处理它的返回代码。

代码语言:javascript
复制
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可以返回错误码。

票数 5
EN

Stack Overflow用户

发布于 2013-01-08 17:07:40

在JScript中有一个类似的方法,可以让.js文件在CScript中运行:

代码语言:javascript
复制
(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://gist.github.com/4482361

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4692542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档