如何启动VBS的交互式控制台?

8
2个回答

10
我几年前写了this。它基于这篇博客文章(存档在此处),但加入了一些改进。本质上,它是一个使用Execute语句的REPL(读取、执行、打印、循环)。
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
    WshShell.Run "cscript """ & WScript.ScriptFullName & """" & Str, 1
    WScript.Quit
End If

Do While True
    WScript.StdOut.Write(">>> ")

    line = Trim(WScript.StdIn.ReadLine)

    If LCase(line) = "exit" Then Exit Do

    On Error Resume Next
    Execute line
    If Err.Number <> 0 Then
        WScript.StdErr.WriteLine Err.Description
    End If
    On Error Goto 0
Loop

我通常会用相同名称的批处理文件(例如“vbs.vbs”和“vbs.bat”)启动它,代码如下:
@cscript.exe //NoLogo %~dpn0.vbs

我会添加 If Left(line, 2) = "? " Then line = Replace(line, "? ", "WScript.Echo ", 1, 1),以模仿 VBA IDE 的操作。 - Tomalak
1
感谢您发现语法错误。代码示例仅是一种最简实现,以演示该功能的一般工作原理。我的真实代码(在答案开头的链接中)稍微复杂一些,并使用“?”打开给定关键字的VBScript帮助文件。 - Ansgar Wiechers
我希望它能够用“_”继续行。 - js2010
@js2010 真实的东西。 - Ansgar Wiechers
这对于一行代码看起来很不错。我无法创建子程序和函数。这是REPL的限制吗?我真的很喜欢这个答案,特别是@Tomalak的额外贡献。 - Daniel 'Dang' Griffith
1
@Daniel'Dang'Griffith 你可以使用 : 分隔多个语句,例如 Sub Test() : Msgbox("Hey") : End Sub,但当然这很快就会变得笨重。对于更复杂的行为,你需要离开 WScript.StdIn.ReadLine(),例如使用一个循环来读取 WScript.StdIn.Read(1) 直到找到特定的“现在运行所有这些”关键字。如果你下定决心,肯定是可行的。 - Tomalak

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接