C# 使用C在同一进程中执行多个命令行#
您好,根据我的上一个问题,我尝试编写一个sql编辑器或类似的东西,通过这种方式,我尝试从C#连接到CMD并执行我的命令。 现在我的问题是我连接到SQLPLUS之后,我无法获得SQLPLUS命令,我查看的其他资源也不能满足我的要求。请帮助我在连接到sqlplus后,如何使用我的进程来运行sql命令?现在我使用以下代码:C# 使用C在同一进程中执行多个命令行#,c#,command,C#,Command,您好,根据我的上一个问题,我尝试编写一个sql编辑器或类似的东西,通过这种方式,我尝试从C#连接到CMD并执行我的命令。 现在我的问题是我连接到SQLPLUS之后,我无法获得SQLPLUS命令,我查看的其他资源也不能满足我的要求。请帮助我在连接到sqlplus后,如何使用我的进程来运行sql命令?现在我使用以下代码: //Create process System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
//Create process
System.Diagnostics.Process pProcess = new System.Diagnostics.Process();
//strCommand is path and file name of command to run
pProcess.StartInfo.FileName = strCommand;
//strCommandParameters are parameters to pass to program
pProcess.StartInfo.Arguments = strCommandParameters;
pProcess.StartInfo.UseShellExecute = false;
//Set output of program to be written to process output stream
pProcess.StartInfo.RedirectStandardOutput = true;
//Optional
pProcess.StartInfo.WorkingDirectory = strWorkingDirectory;
//Start the process
pProcess.Start();
//Get program output
string strOutput = pProcess.StandardOutput.ReadToEnd();
//Wait for process to finish
pProcess.WaitForExit();
我定制了它。我分离了初始化,有一次我仍然有问题,我创建了进程对象,为了运行第二个命令,我在第二次调用中使用了以下代码:
pProcess.StartInfo.FileName = strCommand;
//strCommandParameters are parameters to pass to program
pProcess.StartInfo.Arguments = strCommandParameters;
//Start the process
pProcess.Start();
//Get program output
string strOutput = pProcess.StandardOutput.ReadToEnd();
//Wait for process to finish
pProcess.WaitForExit();
提前谢谢你的问题有点让人困惑,但我想我看到了你的问题。首先你应该看看这篇博文。您的代码碰巧违反了此处未列出的代码。流程对象本身的重用 您需要重构代码,如下所示:
class MyProcessStarter
{
private ProcessStartInfo _startInfo = new ProcessStartInfo();
public MyProcessStarter(string exe, string workingDir)
{
_startInfo.WorkingDirectory = workingDir;
_startInfo.FileName = exe;
_startInfo.UseShellExecute = false;
_startInfo.RedirectStandardOutput = true;
}
public string Run(string arguments)
{
_startInfo.Arguments = arguments;
Process p = Process.Start(_startInfo);
p.Start();
string strOutput = p.StandardOutput.ReadToEnd();
p.WaitForExit();
return strOutput;
}
}
我已经编写了一个更完整、更准确的实现,名为。下面演示了执行相同操作的用法:
using CSharpTest.Net.Processes;
partial class Program
{
static int Main(string[] args)
{
ProcessRunner run = new ProcessRunner("svn.exe");
run.OutputReceived += new ProcessOutputEventHandler(run_OutputReceived);
return run.Run("update", "C:\\MyProject");
}
static void run_OutputReceived(object sender, ProcessOutputEventArgs args)
{
Console.WriteLine("{0}: {1}", args.Error ? "Error" : "Output", args.Data);
}
}
在发送另一个命令之前,您需要从输入中读取所有数据 如果没有可用的数据,你就不能要求阅读。。。有点烂,不是吗 我的解决方案。。。当要求阅读时。。。要求读取一个大缓冲区。。。像一百万 您需要等待至少100毫秒。。。示例代码
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim oProcess As New Process()
Dim oStartInfo As New ProcessStartInfo("cmd.exe", "")
oStartInfo.UseShellExecute = False
oStartInfo.RedirectStandardOutput = True
oStartInfo.RedirectStandardInput = True
oStartInfo.CreateNoWindow = True
oProcess.StartInfo = oStartInfo
oProcess.Start()
oProcess.StandardInput.WriteLine("dir")
Threading.Thread.Sleep(100)
Dim Response As String = String.Empty
Dim BuffSize As Integer = 1024 * 1024
Dim bytesRead As Integer = 0
Do
Dim x As Char() = New Char(BuffSize - 1) {}
bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize)
Response = String.Concat(Response, String.Join("", x).Substring(0, bytesRead))
Loop While oProcess.StandardOutput.Peek >= 0
MsgBox(Response)
Response = String.Empty
oProcess.StandardInput.WriteLine("dir c:\")
Threading.Thread.Sleep(100)
bytesRead = 0
Do
Dim x As Char() = New Char(BuffSize - 1) {}
bytesRead = oProcess.StandardOutput.Read(x, 0, BuffSize)
Response = String.Concat(Response, String.Join("", x).Substring(0, bytesRead))
'Response = String.Concat(Response, String.Join("", x))
Loop While oProcess.StandardOutput.Peek >= 0
MsgBox(Response)
End Sub
End Class
FWIW,那些评论只是噪音…你是说你想启动一次进程,但向它发送多个命令?如果是这样的话,为什么不发送多个命令,每次从头开始整个过程(双关语不是有意的,但无论如何都很有趣)确切地说。。。我只运行了一次sqlplus,然后我给user/pass,如果它登录,则发送Sql.PL命令。我有点困惑:(实际上,每次我尝试连接DB并运行命令时都需要时间…但我不知道,也许其他软件会这样使用?哈?有想法吗?谢谢老兄,第一个代码很有用,但我仍然有错误!!!你知道,我的过程是这样运行的:我将其转换为exec命令:sqlplus user/pass@dbsqlplus提示符“amir”;