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

Ric*_*ard 17 vbscript arguments wsh

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

一个快速的谷歌搜索显示了大量的例子,但其中一些只是不起作用,而那些通常不能处理它可能已经参数运行的事实,所以我很想知道最好的方法是什么.

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

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
Run Code Online (Sandbox Code Playgroud)

我很欣赏这可能很容易修改以处理参数,但意识到这可能不是解决问题的最佳方法.

背景:我正在编写一个脚本,可以通过双击或(很可能)从DOS批处理文件或作为计划任务运行.它可以包含一个或多个可选的命令行参数.

小智 22

我的主,什么是纯粹的垃圾.看到这样肮脏的编码让我哭泣(对任何人都没有冒犯,哈哈).但说真的,这是我的2便士:

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
Run Code Online (Sandbox Code Playgroud)

它处理参数,AND检查所述参数中的空格 - 因此,如果文件名传递给包含空格的原始脚本实例,则传递给cscript.exe时不会"标记化".

它唯一不做的是测试StdIn(例如,在某人通过命令行将某些内容传递给脚本,但忘记使用"cscript script.vbs") - 但是如果它是由WScript执行的话. exe,WScript.StdIn的方法都返回Invalid Handle错误,所以无论如何都无法测试.

如果有办法"打破"这个,请随时告诉我.如果有必要,我愿意改进它.


小智 5

对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
Run Code Online (Sandbox Code Playgroud)

注意:“cmd /k”让窗口在执行后保持不变。参数“1”激活窗口。参数“true”等待终止,因此变量“ret”可以返回错误代码。