【问题标题】:vbscript output to consolevbscript 输出到控制台
【发布时间】:2011-05-22 07:01:31
【问题描述】:

使用 vbscript 将结果输出到控制台的命令或最快方法是什么?

【问题讨论】:

    标签: windows vbscript console output


    【解决方案1】:

    你的意思是:

    Wscript.Echo "Like this?"
    

    如果您在wscript.exe(.vbs 扩展名的默认处理程序,所以如果您双击脚本会得到什么)下运行它,您将获得一个“消息框”对话框,其中包含您的文本。如果您在 cscript.exe 下运行它,您将在控制台窗口中获得输出。

    【讨论】:

    • 您可以直接在 wscript.exe 上使用函数MsgBox("text")MsgBox(object.property)Wscript.Echo 更容易编写。谢谢。
    • 对我来说不直观,WScript.Echo 必须用于无论您是通过WScript 还是CScript 运行。也就是说,没有CScript.Echo,以防未来的谷歌人想知道。 (非常很高兴 msgboxes 消失了 [当使用 cscript 运行时],但是;谢谢。)
    • @GabrielStaples - 没有股票WScript.Echo。我想,如果你想完全留在 WScript 中,你可以做一些非常狡猾的事情,比如执行另一个进程来对父进程执行“SendKeys”以关闭 MessageBox。
    • 其实我刚找到这个popup方法。与echo 非常相似,但允许您指定超时时间,之后它将自动关闭弹出框。非常方便好用:technet.microsoft.com/en-us/library/ee156593.aspx
    【解决方案2】:

    这是在 Dragon-IT Scripts and Code Repository 上找到的。

    您可以通过以下方式做到这一点,并远离 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."
    

    【讨论】:

    • 如果脚本是通过双击启动并因此使用 wscript 打开,则脚本会导致错误消息:“Invalid Handle”。
    • @Bernhard:如果您使用 wscript.exe 运行脚本,则会收到此错误。 Wscript 是面向窗口的,没有控制台流。改用 cscript.exe:technet.microsoft.com/en-us/library/bb490816.aspx
    • @BernhardHiller 有一个有效点。这个答案的主旨是直接使用 stdout 可以避免 CScript/WScript 的差异。这是不正确的。这个解决方案仍然只能在 CScript.exe 下工作,因此与仅使用 WScript.Echo 相比似乎没有太多好处。事实上,差异被放大了,因为脚本在 WScript 下根本不再运行。它是一种有其用途的有效技术,例如,如果需要写入 StdErr,但在此答案的上下文中,它具有误导性。
    • 我只是想强调这种方法相对于WScript.Echo 的好处:cscript //b foobar.vbs 在没有任何控制台输出的情况下运行foobar.vbs,但是通过Rob 的方法,即使通过\\b 也可以有输出到cscript.exe
    • @RLH 你拯救了我的一天......
    【解决方案3】:

    你只需要强制 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)
    

    【讨论】:

    • 你确定回答actual question吗?
    • 是的,只调用 ForceConsole() 然后使用 printf() 在输出控制台打印文本。此外,您还有其他别名来清除屏幕、扫描文本并等待(睡眠)
    • 有史以来最好的解决方案,谢谢,但只有“ForceConsole”功能很重要,“printf”和其他功能完全没有必要,因为如果你强制关闭 Wscript.exe 实例上的当前脚本,然后运行当前脚本的新 cscript.exe 实例,然后 Wscript.Echo 将输出到该控制台实例...
    【解决方案4】:

    我看到了这篇文章,然后又回到了我前一段时间使用的一种方法,它类似于@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
    

    【讨论】:

      【解决方案5】:

      将文本输出到控制台有五种方式:

      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%。

      【讨论】:

      • ... 正如在对先前答案的评论中所说,这在使用 wscript.exe 执行时不起作用:stackoverflow.com/questions/4388879/…
      • 还找到了关于 GetStandardStream() 与 WScript.StdIn/.StdOut/.StdErr 的解释:“VBScript in a Nutshell: A Desktop Quick Reference (2nd Edition)”books.google.fr/books?id=NLpuZSatG3QC 第 298 页说它是“功能等效”。
      • 当你说“这行不通”时,你能具体说明一下这五种方法中的哪一种行不通,你说的行不通是什么意思?
      【解决方案6】:

      使用以下代码创建一个 .vbs,这将打开您的主 .vbs:

      Set objShell = WScript.CreateObject("WScript.shell") 
      objShell.Run "cscript.exe ""C:\QuickTestb.vbs"""
      

      这是我的主要 .vbs

      Option Explicit
      Dim i
      for i = 1 To 5
           Wscript.Echo i
           Wscript.Sleep 5000
      Next
      

      【讨论】:

      • 如果 OP 要求 最快的方式Sleep 是不是有点违反直觉?
      猜你喜欢
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多