vbscript виведення на консоль


Відповіді:


311

Ти маєш на увазі:

Wscript.Echo "Like this?"

Якщо ви запустите це в розділі wscript.exe(обробник за замовчуванням для розширення .vbs, тож, що ви отримаєте, якщо двічі клацнути по скрипту), ви отримаєте діалогове вікно "MessageBox" з текстом у ньому. Якщо запустити це, cscript.exeви отримаєте висновок у вікні консолі.


1
Ви можете безпосередньо використовувати на wscript.exe функцію MsgBox("text")або, MsgBox(object.property)але Wscript.Echoпростіше писати. Дякую.
м3нда

22
Для мене неінтуїтивно WScript.Echo потрібно використовувати, чи ви працюєте через WScriptабо CScript. Тобто, НЕCScript.Echo , в разі , якщо в майбутньому Googlers диво. ( Дуже радий, що msgboxes пішов [коли запускається з cscript], проте; спасибі.)
ruffin

1
@GabrielStaples - Не з / по запас WScript.Echo. Я вважаю, що якщо ви хочете повністю залишитися в WScript, ви можете зробити щось жахливе хитрість, наприклад, виконувати інший процес, щоб зробити "SendKeys" для батьківського процесу, щоб закрити MessageBox.
Еван Андерсон

4
Власне, я просто знайшов цей popupметод. Дуже схожий на, echoале дозволяє вказати час очікування, після якого воно автоматично закриє спливаюче вікно. Дуже зручно та просто у використанні: technet.microsoft.com/en-us/library/ee156593.aspx
Габріель Степлес

63

Це було знайдено у 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."

5
Якщо сценарій запускається подвійним клацанням і відкривається таким чином за допомогою wscript, скрипт призводить до повідомлення про помилку: "Недійсна ручка".
Бернхард Гіллер

6
@Bernhard: Ви отримуєте цю помилку, якщо запускаєте сценарій за допомогою wscript.exe. Wscript орієнтований на Windows і не має консольних потоків. Використовуйте замість cscript.exe: technet.microsoft.com/en-us/library/bb490816.aspx
Axel Kemper

20
@BernhardHiller має дійсну точку. Ця відповідь полягає в тому, що використання stdout безпосередньо дозволить уникнути відмінностей CScript / WScript. Це неправильно. Це рішення все ще працює лише під CScript.exe, тому, мабуть, користі від простого використання не існує WScript.Echo. Насправді різницю збільшують, оскільки сценарій більше не працюватиме під WScript. Це дійсна методика, яка використовує її, наприклад, якщо потрібно писати на StdErr, але в контексті цієї відповіді вона вводить в оману.
Тім Лонг

3
Я просто хочу засвітити перевагу цього методу над WScript.Echo: cscript //b foobar.vbs працює foobar.vbsбез консольного виводу, але методом Роба ви можете отримати вихід навіть при переході \\bдоcscript.exe
С. Разі

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)

Ви впевнені, що відповідає на власне питання ?
дакаб

Так, лише зателефонуйте на ForceConsole (), а потім використовуйте printf () для друку тексту на вихідній консолі. Також у вас є інші псевдоніми, щоб очистити екран, сканувати текст і почекати (спати)
MadAntrax,

1
Найкраще рішення, спасибі, але важлива лише функція "ForceConsole", "printf" та інше зовсім непотрібні, оскільки якщо ви змусите закрити поточний сценарій на екземплярі Wscript.exe, а потім запустити новий екземпляр cscript.exe поточний сценарій, тоді Wscript.Echo виведе на цей екземпляр консолі ...
ElektroStudios

6

Я наткнувся на цю посаду і повернувся до підходу, який я використовував деякий час тому, який схожий на @ MadAntrax's.

Основна відмінність полягає в тому, що він використовує визначений користувачем 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 також завжди виводить на консоль. Це вимагає додаткового створення об'єкта, але це приблизно на 10% швидше, ніж WScript.Echo.


1
... і як сказано в коментарі до попередніх відповідей, це не працює при виконанні з wscript.exe: stackoverflow.com/questions/4388879 / ...
maxxyme

Також було знайдено пояснення щодо GetStandardStream () vs WScript.StdIn / .StdOut / .StdErr: "VBScript в горішці: Короткий довідник на робочому столі (2-е видання)" books.google.fr/books?id=NLpuZSatG3QC на сторінці 298 йдеться про це " функціонально еквівалентний ".
maxxyme
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.