gpt4 book ai didi

vbscript - VBscript代码捕获标准输出,而不显示控制台窗口

转载 作者:行者123 更新时间:2023-12-03 13:29:46 29 4
gpt4 key购买 nike

这是一个VBScript代码示例,显示了如何捕获命令行程序发送到标准输出的任何内容。
它执行命令xcopy /?,并在消息框中显示输出。在出现消息框之前,您会瞬间看到控制台窗口弹出。

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


这是另一个VBScript代码示例,该示例显示如何在不显示控制台窗口的情况下执行脚本。

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


要么

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


如您所见,它的格式为 <script><space><executor>
最后一个示例使用 objShell.Run而不是 objShell.Exec

我不知道如何执行命令行程序(如果需要,可以从批处理文件中执行),捕获标准输出,而不显示控制台窗口。有任何想法吗?

最佳答案

这个概念证明脚本:

' 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


显示了如何使用.Run和临时文件通过隐藏的控制台获取诸如反引号的内容。体面的文件处理,用sCmd引用,清理返回的字符串以及处理编码将需要更多的工作。但是也许您可以使用该策略来实现满足您需求的东西。

关于vbscript - VBscript代码捕获标准输出,而不显示控制台窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4919573/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com