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サービスを作成します。そのWebサービスに結果をデータベースに書き込み、そのサービスからメソッドを公開して情報を取得します。ほとんどのプログラマーが精通している一連のテクノロジーを使用すると、保守が容易になります。唯一の問題は、コンソールアプリがどのように実行されるかということです。コンソールアプリをWindowsサービスに変換する価値はありますか?着信要求をリッスンして処理を実行します。WCFは、この種のタスクを処理するのに非常に便利です。どう思いますか?

WCFランディングページ

方法:マネージドWindowsサービスでWCFサービスをホストする

Webサーバーが、wcfサービスがインストールされているターゲットマシンへの接続を開くことができることを確認するために、ネットワーク担当者と話し合う必要があります。

于 2011-05-24T19:54:31.920 に答える
1

はい、sqlcmd変数を利用することで1行でfor可能です

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アペンダーを使用してlog4netを構成します。
  • 必要に応じて、ログメッセージもログファイルに書き込まれるように、ローリングファイルアペンダーも構成します。
  • 標準エラーがイベントログに書き込まれるように、イベントログアペンダーを追加して、運用担当者がアラートを接続できるようにすることができます。

log4netをこのように使用するのが好きです。これにより、本番バッチの処理が簡単になります。通常のコンソール出力を取得できますが、同時にテキストファイル、SQLデータベース、またはWindowsイベントログで取得できます。運用担当者を幸せにします(より)。

于 2011-05-24T20:13:05.313 に答える