VBscript code to capture stdout, without showing console window

前端 未结 7 618
生来不讨喜
生来不讨喜 2020-11-28 11:48

This is a VBScript code example that shows how to catch whatever a command line program sends to standard output. It executes the command xcopy /? and shows the

相关标签:
7条回答
  • 2020-11-28 12:28

    This is the way you can get the command line StdOut (result) without see this popup black dos windows in 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()
    
    0 讨论(0)
  • 2020-11-28 12:30

    In order to redirect the output to the console, run the script using cscript, ex.: c:\cscript myscript.vbs.

    cscript has a few command line options. The most important (to me) is the switch //NOLOGO. If yoy use it (cscript //nologo myscript.vbs) it will omit Microsoft merchandise...

    0 讨论(0)
  • 2020-11-28 12:35

    If you don't mind having the taskbar button appear, you can just move the console window offscreen before launching it.

    If the HKCU\Console\WindowPosition key exists, Windows will use its value to position the console window. If the key doesn't exist, you'll get a system-positioned window.

    So, save the original value of this key, set your own value to position it offscreen, call Exec() and capture its output, then restore the key's original value.

    The WindowPosition key expects a 32-bit value. The high word is the X coordinate and the low word is the Y coordinate (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
    

    If you really want to make sure the coordinates are offscreen, you can get the screen dimensions via VBScript by using IE or other tools.

    0 讨论(0)
  • 2020-11-28 12:36

    To return in VBA all subfolders in G:\OF

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

    to split the returned string into an array

    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
    
    0 讨论(0)
  • 2020-11-28 12:41

    This proof of concept script:

    ' 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
    

    shows how to use .Run and temporary files to get something like backticks with a hidden console. Decent file handling, quoting in sCmd, cleaning of the returned strings, and dealing with encodings will require more work. But perhaps you can use the strategy to implement something that fits your needs.

    0 讨论(0)
  • 2020-11-28 12:49

    I usually use this:

    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 
    

    For more advanced commands youc an wrap to comspec (cmd)

    my res = execStdOut("%comspec%" & " /c " & """" & "dir /b c:\windows\*.exe" & """" & " && Echo. && Echo finished") 
    
    0 讨论(0)
提交回复
热议问题