我要实现vb中点按钮1将text1.text中的文本写入cmd并回车执行 获取执行结果并判断是否为所要的结果 如果是则执行将text2.text文本接着输入到打开的cmd中 然后点击按钮2执行text3.text的中的文本 并返回结果 从结果中选择与text4.text中的文本对应的值,并返回该值前几位的值 显示到text5.text中请高手指点,不胜感激

解决方案 »

  1.   

    if retunCmdResult(text1.text)="xxx" then
      msgbox retunCmdResult(text2.text)
    else
      msgbox retunCmdResult(text3.text)'“与text4.text中的文本对应的值,并返回该值前几位的值 显示到text5.text”,自己处理
    end if
    以下放入标准模块。'描述:cmd命令管道
    '调用范例:MsgBox retunCmdResult("dir")
    Option ExplicitPrivate Const NORMAL_PRIORITY_CLASS = &H20&
    Private Const STARTF_USESTDHANDLES = &H100&
    Private Const STARTF_USESHOWWINDOW = &H1Private Type SECURITY_ATTRIBUTES
            nLength As Long
            lpSecurityDescriptor As Long
            bInheritHandle As Long
    End TypePrivate Type STARTUPINFO
        cb As Long
        lpReserved As Long
        lpDesktop As Long
        lpTitle As Long
        dwX As Long
        dwY As Long
        dwXSize As Long
        dwYSize As Long
        dwXCountChars As Long
        dwYCountChars As Long
        dwFillAttribute As Long
        dwFlags As Long
        wShowWindow As Integer
        cbReserved2 As Integer
        lpReserved2 As Long
        hStdInput As Long
        hStdOutput As Long
        hStdError As Long
    End TypePrivate Type PROCESS_INFORMATION
        hProcess As Long
        hThread As Long
        dwProcessID As Long
        dwThreadID As Long
    End TypePrivate Declare Function CreatePipe Lib "kernel32" (phReadPipe As Long, phWritePipe As Long, lpPipeAttributes As SECURITY_ATTRIBUTES, ByVal nSize As Long) As Long
    Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
    Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Function retunCmdResult(strCommand As String) As String
        Dim Proc As PROCESS_INFORMATION '进程信息
        Dim Start As STARTUPINFO '启动信息
        Dim SecAttr As SECURITY_ATTRIBUTES '安全属性
        Dim hReadPipe As Long '读取管道句柄
        Dim hWritePipe As Long '写入管道句柄
        Dim lngBytesRead As Long '读出数据的字节数
        Dim strBuffer As String * 256 '读取管道的字符串buffer
        Dim Command As String 'DOS命令
        Dim ret As Long 'API函数返回值
        Dim lpOutputs As String '读出的最终结果
        
        '设置安全属性
        With SecAttr
        .nLength = LenB(SecAttr)
        .bInheritHandle = True
        .lpSecurityDescriptor = 0
        End With
        
        '创建管道
        ret = CreatePipe(hReadPipe, hWritePipe, SecAttr, 0)
        If ret = 0 Then
        MsgBox "无法创建管道", vbExclamation, "错误"
        Exit Function
        End If
        
        '设置进程启动前的信息
        With Start
        .cb = LenB(Start)
        .dwFlags = STARTF_USESHOWWINDOW Or STARTF_USESTDHANDLES
        .hStdOutput = hWritePipe '设置输出管道
        .hStdError = hWritePipe '设置错误管道
        End With
        
        '启动进程
        Command = strCommand 'DOS进程以ipconfig.exe为例
        ret = CreateProcess(vbNullString, Command, SecAttr, SecAttr, True, NORMAL_PRIORITY_CLASS, ByVal 0, vbNullString, Start, Proc)
        If ret = 0 Then
        MsgBox "无法启动新进程", vbExclamation, "错误"
        ret = CloseHandle(hWritePipe)
        ret = CloseHandle(hReadPipe)
        Exit Function
        End If
        
        '因为无需写入数据,所以先关闭写入管道。而且这里必须关闭此管道,否则将无法读取数据
        ret = CloseHandle(hWritePipe)
        
        '从输出管道读取数据,每次最多读取256字节
        Do
        ret = ReadFile(hReadPipe, strBuffer, 256, lngBytesRead, ByVal 0)
        lpOutputs = lpOutputs & Left(strBuffer, lngBytesRead)
        DoEvents
        Loop While (ret <> 0) '当ret=0时说明ReadFile执行失败,已经没有数据可读了
        
        '读取操作完成,关闭各句柄
        ret = CloseHandle(Proc.hProcess)
        ret = CloseHandle(Proc.hThread)
        ret = CloseHandle(hReadPipe)
        
        retunCmdResult = lpOutputs
    End Function
      

  2.   

    谢谢你的管道
    还有我要做个工作是要调ac无线局域网控制器, 是linux写的系统,要通过telnet登陆进去,我的text1.text里放的是用户名,要等text1.text的用户名输入到cmd里 判断等cmd回显password后 把text2.text的密码输入到cmd里
     以上过程需要在点击一个按钮后完成
    还有一个过程为,点击按钮在cmd里运行一个命令,在cmd回显里查text3.text中内容,如果查找到,则返回所查找内容在回显内容里后面某个值的 
    如回显 www.hao123.com 456   text3.text中内容为text3.text 则在text4.text中回显456
      

  3.   

    管道好用,但是写起来就费时间了。
    如果您不是要写稳定性极高的程序可以直接运行 cmd /c example.exe>aa.txt
      

  4.   

    嗯。不过可以建立一个Timer查看aa.txt的内容,解决这个问题。
      

  5.   

    可以用这个方法等待进程结束再查看txt
    WaitClose = OpenProcess(SYNCHRONIZE, False, WaitCloseid)
    Call WaitForSingleObject(WaitClose, INFINITE)
    Call CloseHandle(WaitClose)