将静默SQL Server安装的输出重定向到C#中的标准错误?

将静默SQL Server安装的输出重定向到C#中的标准错误?,c#,sql-server,C#,Sql Server,我有以下代码: Process p = new Process(); p.StartInfo.FileName = "SQLEXPRADV_x86_ENU.exe"; p.StartInfo.Arguments = "/CONFIGURATIONFILE=Config.ini"; p.StartInfo.UseShellExecute = false; p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardOutput =

我有以下代码:

Process p = new Process();
p.StartInfo.FileName = "SQLEXPRADV_x86_ENU.exe";
p.StartInfo.Arguments = "/CONFIGURATIONFILE=Config.ini";
p.StartInfo.UseShellExecute = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;

p.Start();

string line;
while ((line = p.StandardOutput.ReadLine()) != null)
{
   tOutputStandard.Text += line + "\r\n";
}

while ((line = p.StandardError.ReadLine()) != null)
{
   tOutputError.Text += line + "\r\n";
}

p.WaitForExit();
配置文件设置为静默运行。 tOutputStandard和tOutputError是显示输出的文本框

但是,它不会显示SQL Server安装的任何输出。我试过运行其他应用程序,它们正确地发送了输出,所以我认为代码没有错

如何让SQL Server将其输出通过管道传输到C#?
如果安装失败,我需要知道错误是什么。

如果管道无法正常工作,您可以随时读取安装日志文件

我还通过Powershell使用静默安装。 对于错误,我查看最新文件夹的安装引导日志文件夹,并在Details.txt文件中循环查找包含“Error”的行

C:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\Log\\Details.txt

不完美,但总比没有输出好。

也许这有帮助。删除以下代码片段:

string line;
while ((line = p.StandardOutput.ReadLine()) != null)
{
   tOutputStandard.Text += line + "\r\n";
}

while ((line = p.StandardError.ReadLine()) != null)
{
   tOutputError.Text += line + "\r\n";
}
连接到事件处理程序OutputDataReceived和ErrorDataReceived:

p.OutputDataReceived += this.OutputDataReceived;
p.ErrorDataReceived += this.ErrorDataReceived;
回调方法如下所示

private void ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    tOutputError.Text += e.Data + "\r\n";
}

private void OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    tOutputStandard.Text += e.Data + "\r\n";
}

因此,这个问题的真正原因是,如果直接从MSI运行,SQL安装将不会输出任何内容

相反,您必须首先运行MSI,并将其解压缩到临时目录,然后在该目录中运行setup exe。此exe将为您提供所需的输出


Markus Safar和事件处理程序发布的答案也可能有助于满足其他需求。

这根本不起作用。另外,你不能只从非GUI线程更新,所以我不知道你希望它如何运行。谢谢,但这有点变化无常,如果版本更改,它会崩溃。另外,您可以通过使用标准输出来获得这个输出。
private void ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    tOutputError.Text += e.Data + "\r\n";
}

private void OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    tOutputStandard.Text += e.Data + "\r\n";
}