vbscript输出到控制台


Answers:


311

你的意思是:

Wscript.Echo "Like this?"

如果您在wscript.exe(.vbs扩展名的默认处理程序,因此双击该脚本时会得到的)下运行该文件,则将看到一个“ MessageBox”对话框,其中包含文本。如果在下面运行该命令,cscript.exe则会在控制台窗口中获得输出。


1
您可以直接在wscript.exe上使用该函数MsgBox("text")MsgBox(object.property)Wscript.Echo更易于编写。谢谢。
m3nda 2015年

22
对我来说,无论您是通过还是进行运行,都WScript.Echo 必须使用它。也就是说,有没有一个,万一将来的Google奇迹。(高兴msgboxes消失了[但是运行时,谢谢;)WScriptCScriptCScript.Echocscript
鲁芬2015年

1
@GabrielStaples-没有股票WScript.Echo。我想,如果您想完全呆在WScript中,则可以执行一些令人毛骨悚然的操作,例如执行另一个进程以对父进程执行“ SendKeys”以关闭MessageBox。
埃文·安德森

4
实际上,我只是找到了这种popup方法。与echo超时时间非常相似,但允许您指定一个超时时间,此后超时将自动关闭弹出框。非常方便且易于使用:technet.microsoft.com/en-us/library/ee156593.aspx
Gabriel Staples

63

这可在Dragon-IT脚本和代码存储库中找到

您可以通过以下操作来做到这一点,并且远离cscript / wscript差异,并允许您获得与批处理文件相同的控制台输出。如果从批处理文件调用VBS并需要使其看起来无缝,这将有所帮助。

Set fso = CreateObject ("Scripting.FileSystemObject")
Set stdout = fso.GetStandardStream (1)
Set stderr = fso.GetStandardStream (2)
stdout.WriteLine "This will go to standard output."
stderr.WriteLine "This will go to error output."

5
如果脚本是通过双击启动的,并因此通过wscript打开,则脚本会导致错误消息:“无效的句柄”。
2013年

6
@Bernhard:如果使用wscript.exe运行脚本,则会出现此错误。Wscript是面向Windows的,没有控制台流。请改用cscript.exe:technet.microsoft.com/zh-CN/library/bb490816.aspx
Axel Kemper,

20
@BernhardHiller有一个正确的观点。这个答案的重点是直接使用stdout可以避免CScript / WScript的差异。那是不对的。该解决方案仍然仅在CScript.exe下有效,因此似乎没有比仅使用带来太多好处WScript.Echo。实际上,差异被放大了,因为该脚本将不再在WScript下运行。它是一种有效的技术,有其用途,例如,如果有人需要写StdErr,但是在此答案的背景下,这是一种误导。
Tim Long

3
我只是想通过以下方法来显示此方法的好处WScript.Echocscript //b foobar.vbs 运行时foobar.vbs没有任何控制台输出,但是通过Rob的方法,即使传递\\bcscript.exe
S. Razi,2014年

24

您只需要强制使用cscript而不是wscript。我总是使用这个模板。函数ForceConsole()会将您的vbs执行到cscript中,并且您还有漂亮的别名来打印和扫描文本。

 Set oWSH = CreateObject("WScript.Shell")
 vbsInterpreter = "cscript.exe"

 Call ForceConsole()

 Function printf(txt)
    WScript.StdOut.WriteLine txt
 End Function

 Function printl(txt)
    WScript.StdOut.Write txt
 End Function

 Function scanf()
    scanf = LCase(WScript.StdIn.ReadLine)
 End Function

 Function wait(n)
    WScript.Sleep Int(n * 1000)
 End Function

 Function ForceConsole()
    If InStr(LCase(WScript.FullName), vbsInterpreter) = 0 Then
        oWSH.Run vbsInterpreter & " //NoLogo " & Chr(34) & WScript.ScriptFullName & Chr(34)
        WScript.Quit
    End If
 End Function

 Function cls()
    For i = 1 To 50
        printf ""
    Next
 End Function

 printf " _____ _ _           _____         _    _____         _     _   "
 printf "|  _  |_| |_ ___ ___|     |_ _ _ _| |  |   __|___ ___|_|___| |_ "
 printf "|     | | '_| . |   |   --| | | | . |  |__   |  _|  _| | . |  _|"
 printf "|__|__|_|_,_|___|_|_|_____|_____|___|  |_____|___|_| |_|  _|_|  "
 printf "                                                       |_|     v1.0"
 printl " Enter your name:"
 MyVar = scanf
 cls
 printf "Your name is: " & MyVar
 wait(5)

您确定回答了实际问题吗?
dakab

是的,仅调用ForceConsole(),然后使用printf()在输出控制台中打印文本。另外,您还有其他别名可以清除屏幕,扫描文本并等待(睡眠)
MadAntrax

1
最好的解决方案,谢谢,但是只有“ ForceConsole”功能很重要,“ printf”和其余的功能完全没有必要,因为如果您强制关闭Wscript.exe实例上的当前脚本,然后运行一个新的cscript.exe实例,当前脚本,然后Wscript.Echo将输出到该控制台实例...
ElektroStudios

6

我碰到了这篇文章,回到了我之前使用的一种类似于@MadAntrax的方法。

主要区别在于它使用VBScript用户定义的类来包装用于切换到CScript并将文本输出到控制台的所有逻辑,因此使主脚本更加简洁。

假设您的目标是将输出流式传输到控制台,而不是将输出转到消息框。

下面是cCONSOLE类。若要使用它,请在脚本末尾包含完整的类,然后在脚本开始处实例化它。这是一个例子:

    Option Explicit

'// Instantiate the console object, this automatically switches to CSCript if required
Dim CONS: Set CONS = New cCONSOLE

'// Now we can use the Consol object to write to and read from the console
With CONS

    '// Simply write a line
     .print "CSCRIPT Console demo script"

     '// Arguments are passed through correctly, if present
     .Print "Arg count=" & wscript.arguments.count

     '// List all the arguments on the console log
     dim ix
     for ix = 0 to wscript.arguments.count -1
        .print "Arg(" & ix & ")=" & wscript.arguments(ix)
     next

     '// Prompt for some text from the user
     dim sMsg : sMsg = .prompt( "Enter any text:" )

     '// Write out the text in a box
     .Box sMsg

     '// Pause with the message "Hit enter to continue"
     .Pause

End With     




'= =========== End of script - the cCONSOLE class code follows here

这是cCONSOLE类的代码

     CLASS cCONSOLE
 '= =================================================================
 '= 
 '=    This class provides automatic switch to CScript and has methods
 '=    to write to and read from the CSCript console. It transparently
 '=    switches to CScript if the script has been started in WScript.
 '=
 '= =================================================================

    Private oOUT
    Private oIN


    Private Sub Class_Initialize()
    '= Run on creation of the cCONSOLE object, checks for cScript operation


        '= Check to make sure we are running under CScript, if not restart
        '= then run using CScript and terminate this instance.
        dim oShell
        set oShell = CreateObject("WScript.Shell")

        If InStr( LCase( WScript.FullName ), "cscript.exe" ) = 0 Then
            '= Not running under CSCRIPT

            '= Get the arguments on the command line and build an argument list
            dim ArgList, IX
            ArgList = ""

            For IX = 0 to wscript.arguments.count - 1
                '= Add the argument to the list, enclosing it in quotes
                argList = argList & " """ & wscript.arguments.item(IX) & """"
            next

            '= Now restart with CScript and terminate this instance
            oShell.Run "cscript.exe //NoLogo """ & WScript.ScriptName & """ " & arglist
            WScript.Quit

        End If

        '= Running under CScript so OK to continue
        set oShell = Nothing

        '= Save references to stdout and stdin for use with Print, Read and Prompt
        set oOUT = WScript.StdOut
        set oIN = WScript.StdIn

        '= Print out the startup box 
            StartBox
            BoxLine Wscript.ScriptName
            BoxLine "Started at " & Now()
            EndBox


    End Sub

    '= Utility methods for writing a box to the console with text in it

            Public Sub StartBox()

                Print "  " & String(73, "_") 
                Print " |" & Space(73) & "|"
            End Sub

            Public Sub BoxLine(sText)

                Print Left(" |" & Centre( sText, 74) , 75) & "|"
            End Sub

            Public Sub EndBox()
                Print " |" & String(73, "_") & "|"
                Print ""
            End Sub

            Public Sub Box(sMsg)
                StartBox
                BoxLine sMsg
                EndBox
            End Sub

    '= END OF Box utility methods


            '= Utility to center given text padded out to a certain width of text
            '= assuming font is monospaced
            Public Function Centre(sText, nWidth)
                dim iLen
                iLen = len(sText)

                '= Check for overflow
                if ilen > nwidth then Centre = sText : exit Function

                '= Calculate padding either side
                iLen = ( nWidth - iLen ) / 2

                '= Generate text with padding
                Centre = left( space(iLen) & sText & space(ilen), nWidth )
            End Function



    '= Method to write a line of text to the console
    Public Sub Print( sText )

        oOUT.WriteLine sText
    End Sub

    '= Method to prompt user input from the console with a message
    Public Function Prompt( sText )
        oOUT.Write sText
        Prompt = Read()
    End Function

    '= Method to read input from the console with no prompting
    Public Function Read()
        Read = oIN.ReadLine
    End Function

    '= Method to provide wait for n seconds
    Public Sub Wait(nSeconds)
        WScript.Sleep  nSeconds * 1000 
    End Sub

    '= Method to pause for user to continue
    Public Sub Pause
        Prompt "Hit enter to continue..."
    End Sub


 END CLASS

3

有五种方法可以将文本输出到控制台:

Dim StdOut : Set StdOut = CreateObject("Scripting.FileSystemObject").GetStandardStream(1)

WScript.Echo "Hello"
WScript.StdOut.Write "Hello"
WScript.StdOut.WriteLine "Hello"
Stdout.WriteLine "Hello"
Stdout.Write "Hello"

WScript.Echo将输出到控制台,但是仅当使用cscript.exe启动脚本时。如果使用wscript.exe启动,它将输出到消息框。

WScript.StdOut.Write和WScript.StdOut.WriteLine将始终输出到控制台。

StdOut.Write和StdOut.WriteLine也将始终输出到控制台。它需要额外的对象创建,但比WScript.Echo快约10%。


1
...并且如对先前答案的评论中所述,使用wscript.exe执行时,此操作无效:stackoverflow.com/questions/4388879/…–
maxxyme

还找到了有关GetStandardStream()与WScript.StdIn / .StdOut / .StdErr的解释:“ VBScript简而言之:台式机快速参考(第二版)” books.google.fr/books?id=NLpuZSatG3QC第298页说,这是“功能等效”。
maxxyme
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.