将静默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";
}