C# 在命令提示符下运行多个命令

C# 在命令提示符下运行多个命令,c#,command-prompt,C#,Command Prompt,我正在使用这个代码 Process cmd = new Process(); cmd.StartInfo.FileName = "cmd.exe"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.CreateNoWindow = true; cmd.StartInfo.UseShellExecute = false; cmd.Start(

我正在使用这个代码

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine("SQLCMD -E -S srvName -Q \"RESTORE DATABASE dbName FROM DISK=\'C:\\app\\dbName_300915_000.bak\'\"");            
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
textBox2.Text = cmd.StandardOutput.ReadToEnd();
恢复数据库。我的问题是我需要运行

cmd.StandardInput.WriteLine("SQLCMD -E -S srvName -Q \"RESTORE DATABASE dbName FROM DISK=\'C:\\app\\dbName_300915_000.bak\'\""); 

对多个数据库执行多次操作。我是否每次都需要创建不同的流程?我可以一个接一个地使用
cmd.StandardInput.Writeline
,但我希望在每次恢复完成后更新我的文本框

您可以手动或通过代码创建批处理文件,然后在命令提示符下执行该批处理文件

Process p = new Process();
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "C:\\cmd.exe";
p.StartInfo.Arguments = @"<location of batch file>\<batch file name>.bat";
p.Start();
p.WaitForExit();
processp=新流程();
p、 StartInfo.CreateNoWindow=true;
p、 StartInfo.UseShellExecute=false;
p、 StartInfo.FileName=“C:\\cmd.exe”;
p、 StartInfo.Arguments=@“\.bat”;
p、 Start();
p、 WaitForExit();

您也可以这样做,例如:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine("SQLCMD -E -S srvName -Q \"RESTORE DATABASE dbName FROM DISK=\'C:\\app\\dbName_300915_000.bak\'\"");            
cmd.StandardInput.WriteLine("SQLCMD -E -S srvName -Q \"RESTORE DATABASE dbName FROM DISK=\'C:\\app\\dbName_300915_000.bak\'\"");            
cmd.StandardInput.WriteLine("SQLCMD -E -S srvName -Q \"RESTORE DATABASE dbName FROM DISK=\'C:\\app\\dbName_300915_000.bak\'\"");            
cmd.StandardInput.WriteLine("SQLCMD -E -S srvName -Q \"RESTORE DATABASE dbName FROM DISK=\'C:\\app\\dbName_300915_000.bak\'\"");            
cmd.StandardInput.WriteLine("SQLCMD -E -S srvName -Q \"RESTORE DATABASE dbName FROM DISK=\'C:\\app\\dbName_300915_000.bak\'\"");            
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
textBox2.Text = cmd.StandardOutput.ReadToEnd();
此外,ReadToEnd()错误,可能导致死锁。见MSDN:

// To avoid deadlocks, always read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();

为什么不直接从代码运行
SQLCMD
?你为什么需要
cmd
?我不知道你说的直接从你的代码运行SQLCMD是什么意思,
SQLCMD
通过命令提示符运行。为什么不在你的代码中连接到sql server,为什么要调用另一个进程来做这件事呢?这也是可能的,我会从sql server得到反馈吗?有趣!!我可以在我的应用程序之外修改bat文件,而无需修改代码!我的问题是,每次恢复后,我都需要得到某种反馈,并知道它是否已恢复。您的解决方案将在执行每个备份命令后提供信息。是的,在这种情况下,最好将上述代码放入一个方法中并多次执行。不过,我对僵局的看法是正确的。