Este es un ejemplo de código de VBScript que muestra cómo atrapar todo lo que un programa de línea de comando envía a la salida estándar.
Se ejecuta el comando xcopy /? y muestra el resultado en un cuadro de mensaje. Antes de que aparezca el cuadro de mensaje, por una fracción de segundo puede ver la ventana de la consola apareciendo.

Set objShell = WScript.CreateObject("WScript.Shell")
Set objExec = objShell.Exec("xcopy /?")
Do
    line = objExec.StdOut.ReadLine()
    s = s & line & vbcrlf
Loop While Not objExec.Stdout.atEndOfStream
WScript.Echo s

Aquí es otro ejemplo de código de VBScript que muestra cómo ejecutar una secuencia de comandos sin mostrar la ventana de la consola.

objShell.Run "c:\temp\mybatch.bat C:\WINDOWS\system32\cmd.exe", 0

o

objShell.Run "c:\temp\myscript.vbs C:\WINDOWS\system32\cscript.exe", 0

Como se puede ver que tiene la forma <script><space><executor>.
El último ejemplo se utiliza objShell.Run en lugar de objShell.Exec

Lo que no sé es cómo ejecutar un programa de línea de comandos (si es necesario desde un archivo por lotes), coger la salida estándar, sin mostrar la ventana de la consola. Alguna idea?

  • Usted puede utilizar .Exec() método, sin ventana de la consola de flash, archivos temporales e inesperado WScript.Echo silenciador de salida, consulte esta respuesta.
InformationsquelleAutor mgr326639 | 2011-02-07

7 Comentarios

  1. 3

    Esta prueba de concepto de secuencia de comandos:

    ' pocBTicks.vbs - poor man's version of backticks (POC)
    Option Explicit
    ' Globals
    Const SW_SHOWMINNOACTIVE =  7
    Const ForReading         =  1
    Dim goFS  : Set goFS  = CreateObject( "Scripting.FileSystemObject" )
    Dim goWSH : Set goWSH = CreateObject( "WScript.Shell" )
    ' Dispatch
    WScript.Quit demoBTicks()
    ' demoBTicks -
    Function demoBTicks()
    demoBTicks = 1
    Dim aCmds : aCmds = Array( _
    "dir pocBTicks.vbs" _
    , "dur pocBTicks.vbs" _
    , "xcopy /?" _
    )
    Dim sCmd
    For Each sCmd In aCmds
    WScript.Echo "########", sCmd
    Dim aRet : aRet = BTicks( sCmd )
    Dim nIdx
    For nIdx = 0 To UBound( aRet )
    WScript.Echo "--------", nIdx
    WScript.Echo aRet( nIdx )
    Next
    Next
    demoBTicks = 0
    End Function ' demoBTicks
    ' BTicks - execute sCmd via WSH.Run
    '  aRet( 0 ) : goWSH.Run() result
    '  aRet( 1 ) : StdErr /error message
    '  aRet( 2 ) : StdOut
    '  aRet( 3 ) : command to run
    Function BTicks( sCmd )
    Dim aRet    : aRet     = Array( -1, "", "", "" )
    Dim sFSpec2 : sFSpec2  = goFS.GetAbsolutePathName( "." )
    Dim sFSpec1 : sFSpec1  = goFS.BuildPath( sFSpec2, goFS.GetTempName() )
    sFSpec2  = goFS.BuildPath( sFSpec2, goFS.GetTempName() )
    aRet( 3 ) = """%COMSPEC%"" /c """ + sCmd + " 1>""" + sFSpec1 + """ 2>""" +  sFSpec2 + """"""
    Dim aErr
    On Error Resume Next
    aRet( 0 ) = goWSH.Run( aRet( 3 ), SW_SHOWMINNOACTIVE, True )
    aErr      = Array( Err.Number, Err.Description, Err.Source )
    On Error GoTo 0
    If 0 <> aErr( 0 ) Then
    aRet( 0 ) = aErr( 0 )
    aRet( 1 ) = Join( Array( aErr( 1 ), aErr( 2 ), "(BTicks)" ), vbCrLf )
    BTicks    = aRet
    Exit Function
    End If
    Dim nIdx : nIdx = 1
    Dim sFSpec
    For Each sFSpec In Array( sFSpec2, sFSpec1 )
    If goFS.FileExists( sFSpec ) Then
    Dim oFile : Set oFile = goFS.GetFile( sFSpec )
    If 0 < oFile.Size Then
    aRet( nIdx ) = oFile.OpenAsTextStream( ForReading ).ReadAll()
    goFS.DeleteFile sFSpec
    End If
    End If
    nIdx = nIdx + 1
    Next
    BTicks = aRet
    End Function

    muestra cómo utilizar .De ejecución y los archivos temporales para obtener algo como comillas simples inclinadas con una consola oculta. Decente, manejo de archivos, citando en sCmd, la limpieza de las cadenas devueltas, y de lidiar con las codificaciones se requieren más trabajo. Pero tal vez usted puede utilizar la estrategia a implementar algo que se adapte a sus necesidades.

    • Una solución ingeniosa. Lástima de los archivos temporales. Pero no cumple los requisitos para que los puntos son tuyos. Gracias, Marcel.
  2. 14

    Normalmente yo uso este:

    Wscript.echo execStdOut("ping google.com")
    Function execStdOut(cmd)
    Dim goWSH : Set goWSH = CreateObject( "WScript.Shell" ) 
    Dim aRet: Set aRet = goWSH.exec(cmd)
    execStdOut = aRet.StdOut.ReadAll()
    End Function 

    Para los más avanzados comandos youc una envoltura de comspec (cmd)

    my res = execStdOut("%comspec%" & " /c " & """" & "dir /b c:\windows\*.exe" & """" & " && Echo. && Echo finished") 
    • Tenga en cuenta que este se bloqueará si su programa de salidas demasiado (sobre 4 KB IIRC), y no se oculta.
    • Donde están recibiendo la 4KB limitación de? Es que una limitación de StdOut.ReadAll(). Acabo de utilizar StdOut.ReadLine() en un 109KB archivo sin problemas por ss64.com/vb/stdoutread.html. Aunque puedo confirmar que el «no oculto» de la observación, haciendo que esta solución no ideal para aquellos que buscan una «ventana oculta» como un requisito estricto, por el OP.
    • Honestamente no tengo la menor idea, pero probablemente lo he probado y algo colgado después de 4KB, a continuación, otras dos personas vinieron y upvoted es porque algo colgado para ellos también. Si realmente funciona bien, sólo asegúrese de prueba en todas las versiones de Windows que está apoyando. (También, debe tenerse en cuenta: es muy probable que ReadAll va a leer todo en la RAM, y sería muy feo en su propio – yo diría que debe transmitir el StdOut lugar, pero de nuevo no sé cómo; ReadLine no sería bueno para la salida binaria).
    • buen punto sobre el binario y ReadLine(), que podría causar problemas cuando el CRLFs nunca en la corriente. Sin embargo, me gustaría reiterar que el OP del requisito de StdOut, que tiende a favorecer la no-representaciones binarias de los datos. En lo que respecta a múltiples plataformas, voy a realizar algunas pruebas tan lejos como XP y publicar una actualización.
    • Edit: acabo de leer 1145 líneas de texto con un peso de alrededor de 160KB y trabajó muy bien en Windows XP SP3 (como me recuerda usar cmd /c y no cmd /k). Para la lectura de multi-línea de salida, veo a esta solución como ser perfectamente adecuado para la mayoría de la gente, pero yo recomendaría usar ReadLine() más de ReadAll(). En términos de la 4KB limitación, se explica en más detalle aquí: support.microsoft.com/en-us/kb/960246
    • href=»https://support.microsoft.com/en-us/help/960246/hang-when-reading-stderr-stdout-properties-of-wshscriptexec-object» >support.microsoft.com/en-us/help/960246/… habla sobre el límite de 4kb
    • gracias. Por ese mismo artículo Generally, this occurs if the spawned application is writing to both the StdOut and StdErr streams. Por lo que las aplicaciones que no escriba tanto stderr Y stdout no sufren este error.

  3. 6

    Con el fin de redirigir la salida a la consola, ejecute la secuencia de comandos mediante cscript, ex.: c:\cscript myscript.vbs.

    cscript tiene un par de opciones de línea de comandos. La más importante (para mí) es el modificador //NOLOGO. Si interanual de empleo (cscript //nologo myscript.vbs) se omite Microsoft mercancía…

  4. 1

    Si no te importa tener el de la barra de tareas que aparezca el botón, sólo se puede mover la ventana de la consola fuera de la pantalla antes de que se inicie.

    Si el HKCU\Console\WindowPosition clave existe, Windows utilizará su valor para la posición de la ventana de la consola. Si la clave no existe, usted obtendrá un sistema de posición de la ventana.

    Así, guardar el valor original de esta clave, establecer su propio valor de posición de fuera de la pantalla, llamada Exec() y la captura de su salida, a continuación, restaurar la clave del valor original.

    La WindowPosition clave espera un valor de 32 bits. La palabra alta es la coordenada X y la palabra baja es la coordenada (XXXXYYYY).

    With CreateObject("WScript.Shell")
    ' Save the original window position. If system-positioned, this key will not exist.
    On Error Resume Next
    intWindowPos = .RegRead("HKCU\Console\WindowPosition")
    On Error GoTo 0
    ' Set Y coordinate to something crazy...
    .RegWrite "HKCU\Console\WindowPosition", &H1000, "REG_DWORD"
    ' Run Exec() and capture output (already demonstrated by others)...
    .Exec(...)
    ' Restore window position, if previously set. Otherwise, remove key...
    If Len(intWindowPos) > 0 Then
    .RegWrite "HKCU\Console\WindowPosition", intWindowPos, "REG_DWORD"
    Else
    .RegDelete "HKCU\Console\WindowPosition"
    End If
    End With

    Si realmente quieren asegurarse de que las coordenadas estén fuera de la pantalla, usted puede obtener las dimensiones de la pantalla a través de VBScript mediante el uso de IE o de otras herramientas.

  5. 0

    Para volver en VBA todas las subcarpetas en G:\OF

    sub M_snb()
    c00= createobejct("wscript.Shell").exec("cmd /c Dir G:\OF\*. /s/b").stdout.readall
    end sub

    para dividir la cadena devuelta en una matriz

    sub M_snb()
    sn=split(createobejct("wscript.Shell").exec("cmd /c Dir G:\OF\*. /s/b").stdout.readall,vbCrLf)
    for j=0 to ubound(sn)
    msgbox sn(j)
    next
    End Sub
    • -1 para: createobejct, la falta de presupuesto antes de cmd, y no abordar la especificación de «oculto».
  6. 0

    Esta es la forma en que usted puede obtener la línea de comandos StdOut (resultado) sin ver esta ventana emergente negro dos windows en vbscript:

    Set Sh = CreateObject("WScript.Shell")
    tFile=Sh.ExpandEnvironmentStrings("%Temp%")&"\t.txt"
    Sh.Run "cmd.exe /c xcopy /? > """&tFile&""" ",0,False
    Wscript.echo CreateObject("Scripting.FileSystemObject").openTextFile(tFile).readAll()

Dejar respuesta

Please enter your comment!
Please enter your name here