控制台程序重定向(同步方式)

feixuyue 2010-04-22 01:34:38
|-----重定向输入:同步方式
|
|
一个控制台程序(.exe)--|-----重定向输出:同步方式
|
|
|-----重定向错误输出:同步或异步都行
异步读取我会做了,但是不会弄同步读取,求教!
...全文
253 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
feixuyue 2010-04-29
  • 打赏
  • 举报
回复
异步代码给上:
Imports System.IO
Imports System.Threading
''' <summary>
''' 此类实现将程序实现重定位输入和输出(异步方式读取)
''' </summary>
''' <remarks></remarks>
Public Class Shell_exe
#Region "声明"
Implements IDisposable

Dim CmdPcs As New Process
Dim Displayer As TextBoxBase = Nothing
Dim file_name As String = String.Empty
Protected disposed As Boolean = False
Private Delegate Sub Write(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
#End Region
#Region "构造和析构"
Public Sub New(ByRef filename As String)
file_name = filename
End Sub
Public Sub New(ByRef filename As String, ByRef sender As TextBoxBase)
file_name = filename
Displayer = sender
End Sub

Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposed Then
If disposing Then
CmdPcs.CancelErrorRead()
CmdPcs.CancelOutputRead()
CmdPcs = Nothing
file_name = Nothing
End If
Displayer = Nothing
End If
Me.disposed = True
End Sub

Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub

Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub

#End Region
#Region "方法"
Public Function Shell(ByRef sender As Object, ByRef sw As StreamWriter) As Boolean
Displayer = sender
Shell(sw)
End Function

Public Sub Shell(ByRef sw As StreamWriter)
Try
CmdPcs = New Process
With CmdPcs.StartInfo
.FileName = file_name
.UseShellExecute = False
.CreateNoWindow = True
' .WindowStyle = ProcessWindowStyle.Hidden
.RedirectStandardInput = True
.RedirectStandardOutput = True
.RedirectStandardError = True
End With
CmdPcs.Start()
sw = CmdPcs.StandardInput
CmdPcs.BeginErrorReadLine()
CmdPcs.BeginOutputReadLine()
AddHandler CmdPcs.ErrorDataReceived, AddressOf Output
AddHandler CmdPcs.OutputDataReceived, AddressOf Output
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

Public Sub Kill()
Try
CmdPcs.Kill()
Catch ex As Exception
End Try
End Sub
Private Sub Output(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
Try
If Not String.IsNullOrEmpty(e.Data) Then
If Displayer.InvokeRequired Then
Displayer.Invoke(New Write(AddressOf Output), sender, e)
Else
Displayer.AppendText(e.Data & vbCrLf)
Displayer.ScrollToCaret()
End If
End If
Catch ex As Exception
End Try
End Sub
#End Region
End Class
其实上面的代码基本满足我的需要,就是当程序提示要输入数据时,没有提示语言,
因为DataReceivedEventArgs只有当有回车符号时,才触发,所以就没有提示语言,
只有输入数据后,提示语言跟数据一起显示.
兔子-顾问 2010-04-29
  • 打赏
  • 举报
回复
我想了一下,不是很明白你最终要实现的。大概的理解是你想实现
.net程序->调用控制台->调用dos命令->用户确认->继续执行->...
这样效果么?

如果这样,你要考虑,用户确认这个地方可能太多了,用户可能直接敲exit退出命令窗口的哦。我能想到的方法是这样的。
1.新建的是个控制台程序
2.你要调用就调用,结果定向输出到控制台
3.操作完都回到循环状态等待用户输入,如果用户输入的是dos命令则后台执行,结果送回给控制台,模拟一个这样效果。
wsk200209 2010-04-23
  • 打赏
  • 举报
回复
不清楚
feixuyue 2010-04-22
  • 打赏
  • 举报
回复
有没有人能给个代码,感激不尽!
feixuyue 2010-04-22
  • 打赏
  • 举报
回复
为什么排版变成这样了!
|-----重定向输入:同步方式
|
一个控制台程序(.exe)--|-----重定向输出:同步方式
|
|-----重定向错误输出:同步或异步都行

异步读取我会做了,但是不会弄同步读取,求教!

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧