vbscript เอาต์พุตไปยังคอนโซล


165

คำสั่งหรือวิธีที่เร็วที่สุดในการส่งออกผลลัพธ์ไปยังคอนโซลโดยใช้ vbscript คืออะไร?

คำตอบ:


311

คุณหมายถึง:

Wscript.Echo "Like this?"

หากคุณเรียกใช้ภายใต้wscript.exe(ตัวจัดการเริ่มต้นสำหรับส่วนขยาย. vbs ดังนั้นสิ่งที่คุณจะได้รับหากคุณดับเบิลคลิกที่สคริปต์) คุณจะได้รับกล่องโต้ตอบ "MessageBox" พร้อมข้อความของคุณ หากคุณเรียกใช้ภายใต้cscript.exeคุณจะได้รับผลลัพธ์ในหน้าต่างคอนโซล


1
คุณโดยตรงสามารถใช้งานบน wscript.exe ที่ฟังก์ชั่นMsgBox("text")หรือMsgBox(object.property)แต่Wscript.Echoจะง่ายต่อการเขียน ขอบคุณ
m3nda

22
สำหรับฉันโดยไม่ได้ตั้งใจWScript.Echo จะต้องใช้ไม่ว่าคุณจะทำงานผ่านWScriptหรือ CScriptนั่นคือมีไม่CScript.Echoในกรณีที่ชาว Google ในอนาคตน่าแปลกใจ ( มากมีความสุข msgboxes จะหายไป [เมื่อทำงานกับcscript] อย่างไรก็ตาม; ขอบคุณ.)
รัฟฟิน

1
@GabrielStaples - ไม่ w / WScript.Echoหุ้น ฉันคิดว่าถ้าคุณต้องการอยู่ใน WScript อย่างสมบูรณ์คุณสามารถทำสิ่งที่น่ากลัวอย่าง Exec'ing off กระบวนการอื่นเพื่อทำ "SendKeys" ให้กับกระบวนการหลักเพื่อปิด MessageBox
Evan Anderson

4
ที่จริงฉันเพิ่งพบpopupวิธีนี้ คล้ายกันมากกับechoแต่ให้คุณระบุการหมดเวลาหลังจากนั้นมันจะปิดกล่องป๊อปอัพโดยอัตโนมัติ สะดวกและง่ายต่อการใช้งาน: technet.microsoft.com/en-us/library/ee156593.aspx
Gabriel Staples

63

นี้ถูกพบในสคริปมังกรไอทีและรหัสพื้นที่เก็บข้อมูล

คุณสามารถทำสิ่งต่อไปนี้และอยู่ห่างจากความแตกต่าง 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 สคริปต์จะส่งผลให้เกิดข้อความแสดงข้อผิดพลาด: "Invalid Handle"
Bernhard Hiller

6
@Bernhard: คุณได้รับข้อผิดพลาดนี้หากคุณเรียกใช้สคริปต์โดยใช้ wscript.exe Wscript เป็น Windows-oriented และไม่มีคอนโซลสตรีม ใช้ cscript.exe แทน: technet.microsoft.com/en-us/library/bb490816.aspx
Axel Kemper

20
@BernhardHiller มีจุดที่ถูกต้อง แรงผลักดันของคำตอบนี้คือการใช้ stdout โดยตรงจะหลีกเลี่ยงความแตกต่าง CScript / WScript มันไม่ถูกต้อง การแก้ปัญหานี้ยังคงทำงานภายใต้ cscript.exe WScript.Echoจึงมีดูเหมือนจะไม่เป็นประโยชน์มากขึ้นกว่าเพียงแค่ใช้ ในความเป็นจริงความแตกต่างได้รับการขยายเนื่องจากสคริปต์จะไม่ทำงานภายใต้ WScript อีกต่อไป มันเป็นเทคนิคที่ถูกต้องที่มีการใช้งานเช่นถ้าจำเป็นต้องเขียนถึง StdErr แต่ในบริบทของคำตอบนี้มันทำให้เข้าใจผิด
Tim Long

3
ฉันแค่ต้องการให้แสงสว่างของประโยชน์ของวิธีนี้มากกว่าWScript.Echo: cscript //b foobar.vbs ทำงานfoobar.vbsโดยไม่มีคอนโซลเอาต์พุต แต่ด้วยวิธีการของ Rob คุณสามารถมีเอาต์พุตแม้เมื่อผ่าน\\bไปยังcscript.exe
S. Razi

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 () vs WScript.StdIn / .StdOut / .StdErr: "VBScript แบบย่อ: การอ้างอิงอย่างรวดเร็วบนเดสก์ท็อป (รุ่นที่ 2)" books.google.fr/books?id=NLpuZSatG3QCหน้า 298 บอกว่าเป็น " ฟังก์ชันเทียบเท่ากับ ".
maxxyme
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.