我试图制作一个简单的备份应用程序来完成一些任务,比如
我可以在CMD中做所有这些事情,所以我制作了一个EXE,简单地在CMD中使用Process执行这些命令。
唯一一个简单的不工作,并且没有发送任何错误消息的是数据库备份,如果我复制已生成的字符串并过去在CMD中工作。所以我不知道它为什么不起作用。
进程配置,启动,停止和输出列表器代码:
private string lastLine;
private void Wait(string text) {
while (lastLine == null || !lastLine.Contains(text)) {
System.Threading.Thread.Sleep(500);
}
}
private Process cmd = null;
private void StartCmd() {
if (cmd != null) {
StopCmd();
}
ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe") {
RedirectStandardInput = true,
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true,
Verb = "runas",
};
cmd = Process.Start(processStartInfo);
cmd.OutputDataReceived += CmdDataListner;
cmd.BeginOutputReadLine();
}
private void StopCmd() {
cmd.Close();
cmd.Dispose();
cmd = null;
}
private void CmdDataListner(object sender, DataReceivedEventArgs e) {
CmdListner(e.Data);
}
//This is just a RichText in the form to see the output
private void CmdListner(string text) {
if (text == null) {
return;
}
text = text.Trim();
if (text.Length == 0) {
return;
}
if (richTextBox1.InvokeRequired) {
richTextBox1.Invoke(new Action<string>(CmdListner), text);
} else {
lastLine = text;
richTextBox1.AppendText(text + Environment.NewLine);
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.ScrollToCaret();
}
}
CMD命令执行:
private void Backup(){
cmd.StandardInput.WriteLine("D:");
cmd.StandardInput.WriteLine("cd " + path);
cmd.StandardInput.WriteLine("\"c:\\Program Files (x86)\\WinRAR\"\\rar.exe a File.rar targetFolder\"");
Wait("Done");
//More commands...
//Everything works fine so far...
//Than I try
cmd.StandardInput.WriteLine("SqlCmd -E -S ServerName\\Instance –Q \"BACKUP DATABASE BaseXYZ TO DISK = 'D:\\backups\\BaseXYZ.bak'\"");
//Nothing more happens, no output, not error, no nothig...
Wait("BACKUP DATABASE successfully");
cmd.StandardInput.WriteLine("SqlCmd -E -S ServerName\\Instance –Q \"BACKUP DATABASE BaseXYZxxx TO DISK = 'D:\\backups\\BaseXYZxxx.bak'\"");
Wait("BACKUP DATABASE successfully");
cmd.StandardInput.WriteLine("exit");
cmd.StandardInput.Close();
cmd.WaitForExit();
StopCmd();
Application.Exit();
}
当然,我在这个块上有更多的命令,很多for循环等。 但一切正常,只有数据库备份不起作用,即使是在隔离测试中也是如此。它就像是在等待更多输入一样简单地挂起
我已经测试过了
string commandLine = sqlBackup;
MessageBox.Show(commandLine);
cmd.StandardInput.WriteLine(commandLine);
您只需按警告框中的CTRL + C即可将其复制。 比在CMD中通过它并且工作,备份花费不到1秒。该文件位于文件夹中。
当由Process执行时它只是挂起,它不会创建任何文件,即使我等待的时间超过1秒。