提示命令在CMD中运行但在进程执行时不运行(使用CMD进行Sql Server备份)

时间:2018-02-15 13:45:33

标签: c# cmd process backup-sqldatabase

我试图制作一个简单的备份应用程序来完成一些任务,比如

  • Rar文件夹到目的地
  • 备份数据库文件
  • 从其他计算机复​​制一些文件

我可以在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秒。

0 个答案:

没有答案