saída vbscript para console


Respostas:


311

Você quer dizer:

Wscript.Echo "Like this?"

Se você executá-lo em wscript.exe(o manipulador padrão da extensão .vbs, o que você obterá se clicar duas vezes no script), você verá uma caixa de diálogo "MessageBox" com o seu texto. Se você executar isso em baixo, cscript.exeobterá saída na janela do console.


1
Você pode usar diretamente na wscript.exe a função MsgBox("text")ou MsgBox(object.property), mas Wscript.Echoé mais fácil de escrever. Obrigado.
— M3nda

22
Para mim, de forma não intuitiva, WScript.Echo deve ser usado se você estiver executando via WScriptou CScript. Ou seja, há não é um CScript.Echo, no caso futuras Googlers maravilha. ( Muito felizes os Msgboxes são ido [quando executado com cscript], no entanto, obrigado.)
— ruffin

1
@GabrielStaples - Não com o estoque WScript.Echo. Suponho que, se você quiser ficar totalmente dentro do WScript, poderá fazer algo terrivelmente desonesto, como Executar outro processo para executar um "SendKeys" no processo pai para fechar o MessageBox.
— Evan Anderson

4
Na verdade, eu acabei de encontrar esse popupmétodo. Muito parecido com, echomas permite especificar um tempo limite após o qual ele fechará automaticamente a caixa pop-up. Muito conveniente e fácil de usar: technet.microsoft.com/en-us/library/ee156593.aspx
— Gabriel Staples

63

Isso foi encontrado nos scripts Dragon-IT e no repositório de códigos .

Você pode fazer isso com o seguinte e ficar longe das diferenças cscript / wscript e permite obter a mesma saída do console que um arquivo em lotes teria. Isso pode ajudar se você estiver chamando o VBS de um arquivo em lotes e precisar torná-lo uniforme.

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
Se o script for iniciado com um clique duplo e, assim, aberto com o wscript, o script resultará em uma mensagem de erro: "Identificador inválido".
— Bernhard Hiller

6
@ Bernhard: Você está recebendo esse erro se executar o script usando o wscript.exe. O Wscript é orientado para janelas e não possui fluxos de console. Use CSCRIPT.EXE vez: technet.microsoft.com/en-us/library/bb490816.aspx
— Axel Kemper

20
@BernhardHiller tem um ponto válido. O principal desta resposta é que o uso de stdout diretamente evitaria as diferenças de CScript / WScript. Isso está incorreto. Essa solução ainda funciona apenas no CScript.exe, portanto, não parece haver muitos benefícios em usar apenas WScript.Echo. De fato, a diferença é ampliada, porque o script não será mais executado no WScript. É uma técnica válida que tem seus usos, por exemplo, se é necessário escrever para o StdErr, mas, no contexto desta resposta, é enganosa.
— Tim Long

3
Eu só quero esclarecer os benefícios desse método WScript.Echo: cscript //b foobar.vbs Executa foobar.vbssem nenhuma saída do console, mas pelo método de Rob você pode ter saída mesmo quando passa \\bparacscript.exe
— S. Razi

24

Você só precisa forçar cscript em vez de wscript. Eu sempre uso este modelo. A função ForceConsole () executará seus vbs em cscript; você também tem um bom alias para imprimir e digitalizar texto.

 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)

Tem certeza de que responde à pergunta real ?
— dakab 31/08/2015

Sim, chame apenas o ForceConsole () e use printf () para imprimir texto no console de saída. Além disso você tem outros alias a tela clara, texto de digitalização e de espera (sleep)
— MadAntrax

1
Melhor solução de todos os tempos, obrigado, mas apenas a função "ForceConsole" é importante, o "printf" e o restante são totalmente desnecessários, pois se você forçar o fechamento do script atual na instância Wscript.exe e executar uma nova instância cscript.exe de o script atual, então Wscript.Echo saída vontade a essa instância do console ...
— ElektroStudios

6

Me deparei com este post e voltei a uma abordagem que eu usei há algum tempo atrás, que é semelhante à @ MadAntrax.

A principal diferença é que ele usa uma classe definida pelo usuário do VBScript para agrupar toda a lógica para alternar para CScript e enviar texto para o console, tornando o script principal um pouco mais limpo.

Isso pressupõe que seu objetivo é transmitir a saída para o console, em vez de enviar a saída para as caixas de mensagens.

A classe cCONSOLE está abaixo. Para usá-lo, inclua a classe completa no final do seu script e instancie-a logo no início do script. Aqui está um exemplo:

    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

Aqui está o código para a classe 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

Existem cinco maneiras de gerar texto para o console:

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"

O WScript.Echo produzirá no console, mas apenas se o script for iniciado usando o cscript.exe. Ele será exibido nas caixas de mensagens se começar a usar o wscript.exe.

WScript.StdOut.Write e WScript.StdOut.WriteLine sempre serão exibidos no console.

StdOut.Write e StdOut.WriteLine também sempre serão exibidos no console. Requer criação de objeto extra, mas é cerca de 10% mais rápido que o WScript.Echo.


1
... e como disse em um comentário a uma respostas anteriores, isso não funciona ao executar com wscript.exe: stackoverflow.com/questions/4388879/...
— maxxyme

Também foi encontrada uma explicação sobre GetStandardStream () vs WScript.StdIn / .StdOut / .StdErr: "VBScript em poucas palavras: uma referência rápida para área de trabalho (segunda edição)" books.google.fr/books?id=NLpuZSatG3QC página 298 diz que é " funcionalmente equivalente ".
— maxxyme
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.