1 #Region "Microsoft.VisualBasic::ec7a5f11d029d9d601eff724831fde95, Microsoft.VisualBasic.Core\ApplicationServices\Terminal\PipelineCLI.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Module PipelineCLI
35     
36     '         Sub: Start
37     
38     
39     ' /********************************************************************************/
40
41 #End Region
42
43 Imports System.IO
44 Imports System.Runtime.CompilerServices
45 Imports Microsoft.VisualBasic.MMFProtocol.Pipeline
46
47 Namespace Terminal
48
49     ''' <summary>
50     ''' a | b - 管道命令在读写方面更加适合于文本数据,由于省去了IO的时间,故而效率较高
51     ''' </summary>
52     Public Module PipelineCLI
53
54         ''' <summary>
55         ''' 使用管道的方法启动下游的应用程序
56         ''' </summary>
57         ''' <param name="app"></param>
58         ''' <param name="args"></param>
59         ''' <remarks>
60         ''' http://stackoverflow.com/questions/30546522/how-to-use-a-pipe-between-two-processes-in-process-start
61         ''' 
62         ''' let the OS do it. ``StartInfo.FileName = "cmd"`` then prepend ``executablepath`` to params so it looks 
63         ''' the way you would enter it in a command window; 
64         ''' ``StartInfo.Arguments = params`` then start the process 
65         ''' 
66         ''' – Plutonix May 30 '15 at 15:13
67         ''' </remarks>
68         ''' 
69         <Extension>
70         Public Sub Start(buf As Stream, app As StringOptional args As String = "")
71             Dim Proc As New Process
72
73             Proc.StartInfo.CreateNoWindow = True
74             Proc.StartInfo.UseShellExecute = False
75             Proc.StartInfo.FileName = app
76             Proc.StartInfo.RedirectStandardOutput = True
77             Proc.StartInfo.RedirectStandardError = True
78             Proc.StartInfo.RedirectStandardInput = True
79
80             Proc.Start()
81
82             Using writer As New BinaryWriter(Proc.StandardInput.BaseStream)
83                 Dim read As New BinaryReader(buf)
84
85                 Do While True
86                     Dim bufs As Byte() = read.ReadBytes(1024)
87                     Call writer.Write(bufs, Scan0, bufs.Length)
88                 Loop
89
90                 Call writer.Flush()
91                 Call writer.Close()
92             End Using
93
94             Call Proc.WaitForExit()
95         End Sub
96     End Module
97 End Namespace