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

时间:2015-10-08 07:43:02

标签: 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();
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但我想在每次恢复完成后对文本框进行更新。

2 个答案:

答案 0 :(得分:1)

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

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();

答案 1 :(得分:1)

您也可以这样做,例如:

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();