cStdIO 方法参考
ExecuteCommand
执行命令行程序并捕获其标准输出。
vb
Public Function ExecuteCommand( _
ByVal CommandLine As String, _
Optional ByVal TimeoutMs As Long = 10000, _
Optional ByVal CurrentDirectory As String = "", _
Optional ByRef exitCode As Long _
) As String参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
CommandLine | String | - | 要执行的命令行(包含程序路径和参数) |
TimeoutMs | Long | 10000 | 超时时间(毫秒),默认 10 秒 |
CurrentDirectory | String | "" | 工作目录,空字符串表示使用当前目录 |
exitCode | Long | - | 传出参数,进程退出代码 |
返回值
- 成功 - 返回命令行的标准输出文本
- 失败 - 返回错误描述字符串(以 "STDIO ERROR:" 开头)
错误码
通过 exitCode 参数返回的错误码:
| 错误码 | 常量 | 说明 |
|---|---|---|
| 0 | ERROR_OK | 执行成功 |
| 1 | ERROR_CREATE_PIPE | 创建管道失败 |
| 2 | ERROR_DUPLICATE_HANDLE | 复制句柄失败 |
| 3 | ERROR_CREATE_PROCESS | 创建进程失败 |
| 4 | ERROR_READ_OUTPUT | 读取输出失败 |
| 5 | ERROR_PROCESS_TIMEOUT | 执行超时 |
示例
基本用法
vb
Dim StdIO As New cStdIO
Dim Output As String
Dim ExitCode As Long
Output = StdIO.ExecuteCommand("echo Hello World", 5000, "", ExitCode)
Debug.Print Output ' 输出: Hello World带参数的命令
vb
Dim StdIO As New cStdIO
Dim Output As String
Dim ExitCode As Long
' 执行带参数的命令
Output = StdIO.ExecuteCommand( _
"findstr /s /i ""keyword"" *.txt", _
10000, _
"C:\\Documents", _
ExitCode _
)
If ExitCode = 0 Then
Debug.Print "找到匹配:" & Output
Else
Debug.Print "未找到匹配"
End If完整错误处理
vb
Private Sub ExecuteSafe()
Dim StdIO As New cStdIO
Dim Result As String
Dim ExitCode As Long
On Error GoTo ErrorHandler
Result = StdIO.ExecuteCommand("mycommand.exe", 5000, "", ExitCode)
' 检查是否返回错误字符串
If Left$(Result, 11) = "STDIO ERROR" Then
MsgBox "执行错误:" & Result, vbCritical
Exit Sub
End If
' 检查退出码
Select Case ExitCode
Case 0
Debug.Print "执行成功:" & Result
Case 1
Debug.Print "命令返回错误:" & Result
Case 5
MsgBox "执行超时!", vbExclamation
Case Else
Debug.Print "未知错误,退出码:" & ExitCode
End Select
Exit Sub
ErrorHandler:
MsgBox "发生异常:" & Err.Description, vbCritical
End Sub指定工作目录
vb
Private Sub RunInDirectory()
Dim StdIO As New cStdIO
Dim Output As String
Dim ExitCode As Long
' 在指定目录下执行 git 命令
Output = StdIO.ExecuteCommand( _
"git log --oneline -10", _
10000, _
"D:\\Projects\\MyRepo", _
ExitCode _
)
If ExitCode = 0 Then
txtLog.Text = Output
End If
End Sub