我正在浏览我们拥有的一个简单的应用程序,并正在尝试对其进行一些更改/改进。目前,我们的应用程序在远程计算机上运行一个 bat 文件,该文件又执行 DTSX 文件。这很好用。
我想做的是从 bat/dtsx 文件中捕获事件/输出。我找到了这个,但由于我没有直接通过代码运行 DTSX 文件,我不确定这是否适用于此。我对运行 DTSX/SSIS 包知之甚少,所以我什至不确定从哪里开始。
还应该注意,这是在 VB.NET 中完成的。
在我的脑海中,最简单的选择是修改批处理脚本以重定向输出。
dtexec.exe /file myPackage.dtsx > myPackage.log
这将覆盖每次执行的日志文件。您可以通过将当前的 %date% 和 %time% 附加到输出文件名来获得更好的效果。
下一个选项可能是更改您的调用代码。您可以让 .NET 代码读取正在显示的内容,而不是重定向批处理脚本以写入文件。不是最好的代码,它是用 C# 编写的,但我需要去开会,没有时间把它改掉。以下代码查看 ProcessResults 对象并提取标准输出和标准错误流。
this.processStartInfo = new ProcessStartInfo(this.dtUtilPath, parameters);
this.processStartInfo.RedirectStandardError = true;
this.processStartInfo.RedirectStandardOutput = true;
this.processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
this.processStartInfo.UseShellExecute = false;
System.Diagnostics.Process process = null;
// Perhaps it would be better to set this to 0 so that it runs to completion
int waitInMilliSeconds = 1 * 1000;
process = System.Diagnostics.Process.Start(this.processStartInfo);
System.IO.StreamReader standardError = process.StandardError;
System.IO.StreamReader standardOutput = process.StandardOutput;
process.WaitForExit(waitInMilliSeconds);
if (process.HasExited)
{
// Did it do well?
// Currently, prints results to console but based on
// exit code values can do whatever the business need is
System.Console.WriteLine(standardOutput.ReadToEnd());
System.Console.WriteLine(standardError.ReadToEnd());
System.Console.WriteLine(process.ExitCode);
}
不过,此时,您正在考虑使用上述任一解决方案来解析上述文本以获取“您认为重要的任何信息”。如果是我,并且基于我目前对问题域的了解甚少,我会完全跳过 .NET 对信息的捕获。如果您喜欢双重任务,批处理脚本捕获可能会有所帮助,但我会选择本机SSIS 日志记录。这将需要对您部署的包进行代码更改,但我发现我拥有最好的 SSIS 体验