1

我正在开展一个项目,该项目将查询在其他系统上运行的计划任务。我编写了一个运行 schtasks 并将输出重定向到文本文件的控制台应用程序。但是,我想知道是否可以将此输出重定向到 SQL 数据库?

我正在考虑编写一个存储过程来处理所有插入,但我不知道如何处理控制台应用程序中的数据。我已经有一个存储过程,可以将 XML 和文本数据重定向到我过去创建的数据库,但我试图不让文件到处都是。

任何输入都会很棒。这是我的代码,以防有人想看到它:

Process process = new Process();
process.StartInfo.FileName = "C:\\Windows\\System32\\schtasks.exe";
process.StartInfo.Arguments = "/query /s 192.168.0.124";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();

string procOutput = process.StandardOutput.ReadToEnd();

下面只是使用文本编写器重定向到文本文件。

4

4 回答 4

1

我会编写一个网络服务,这个小程序调用它来发布它的信息。让该 Web 服务将结果写入数据库并公开该服务的方法以检索信息。使用一组大多数程序员都熟悉的技术使其更易于维护。唯一的问题是,您的控制台应用程序将如何执行?将控制台应用程序转换为 Windows 服务值得付出努力吗?让它监听传入的请求来做它的事情。WCF 对于处理这些类型的任务非常方便。你怎么看?

WCF 登陆页面

如何:在托管 Windows 服务中托管 WCF 服务

您需要与您的网络人员交谈,以确保您的 Web 服务器可以打开与安装了 wcf 服务的目标计算机的连接。

于 2011-05-24T19:54:31.920 回答
1

for是的,可以通过利用和sqlcmd 变量在一行中:

for /F "skip=1 delims=, tokens=1,2,3*" %i in ('schtasks.exe /query /FO CSV /s <server>') do sqlcmd -E -S <dbserver> -d <db> -Q "insert into <table> (TaskName, NextRun, Status) values ('$(TaskName)', '$(NextRun)', '$(Status)');" /v TaskName=%i /v NextRun=%j /v Status=%k

于 2011-05-24T21:16:01.790 回答
0

如果程序很小,将在受信任的机器上运行,只需使用 SqlConnection(或等效于您的 rdmbs 的连接)创建命令,并通过 procOutput 作为参数执行它)。像这样的东西:

var connection = new System.Data.SqlClient.SqlConnection(connection);
            var command = connection.CreateCommand();
            command.CommandText = "procedureName";
            command.Parameters.Add(new System.Data.SqlClient.SqlParameter("paramName", "output"));
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.ExecuteNonQuery();
于 2011-05-24T19:57:25.010 回答
0

当然。这样做的懒惰方法是:

  • 像现在一样重定向它。
  • 从标准输出和标准错误中读取,而不是直接写入文本文件,请使用 log4net。
  • 使用 SQL appender 配置 log4net 以捕获您编写的日志消息。
  • 如果您愿意,还可以配置一个滚动文件附加程序,以便将日志消息也写入日志文件。
  • 您可以花哨并添加一个事件日志附加程序,以便将标准错误写入事件日志,以便操作人员可以连接警报。

我喜欢以这种方式使用 log4net,因为它使批量生产变得简单。我可以获得正常的控制台输出,同时在文本文件、sql 数据库或 Windows 事件日志中捕获它。让操作人员高兴(更)。

于 2011-05-24T20:13:05.313 回答