アプリケーションからの出力/エラーのリダイレクトに関する StackOverflow の質問をいくつか読みましたが、役に立ちませんでした。
C# コードで実行可能ファイルを開発しました。システム レジストリからソフトウェアを復元し、Web サービスを呼び出してデータベースに保存します。
実行可能ファイル内でメッセージを出力しています
Console.WriteLine("実行可能ファイルからのメッセージ");
一方、CRM アプリケーションがあり、必要なパラメーターを指定して psexec.exe を呼び出す 2 つの win フォームを作成しました。この .exe はリモートでコピーされ、ターゲット マシンで起動されます。
cmd.exe でそのパラメーターを使用して直接 psexec 呼び出しを使用すると、psexec 実行バナーと実行可能出力が表示されます。
何かのようなもの:
PsExec v1.98 - プロセスをリモートで実行
著作権 (C) 2001-2010
Mark Russinovich Sysinternals - www.sysinternals.com
エンタープライズ ソフトウェア @ 2012
アプリケーションからのメッセージ
マシン「XXXXXXX」でタスクを開始
レジストリからソフトウェア リストを復元しています
Program.exe は MACHINE でエラー コード 0 で終了しました。
.NET で psexec 呼び出しを行うと、アプリケーションの出力を回復できません。次のように表示されます。
PsExec v1.98 - プロセスをリモートで実行
著作権 (C) 2001-2010
Mark Russinovich Sysinternals - www.sysinternals.com
Program.exe は MACHINE でエラー コード 0 で終了しました。
プロセスから非同期データを回復しているデリゲートを Process クラスに割り当てていますが、この情報はありません。
C# コンソール アプリケーションの出力が表示されない理由を確認できるコードをいくつか貼り付けます。
私が起動するコマンドは次のとおりです。
Dim CmdExe As String = "\\#MAQUINA# -u #USUARIO# -p #CLAVE# -s -c -f """ + executionPath + """"
パラメータ -s (システムとして実行) -c (ローカル ファイルをリモート システムにコピー) -f (上書きを強制)
Private Sub LanzarProceso()
CheckForIllegalCrossThreadCalls = False
Dim Proceso As New Process
AddHandler Proceso.OutputDataReceived, AddressOf CallbackProcesoAsync
AddHandler Proceso.ErrorDataReceived, AddressOf ErrorDataReceivedAsync
Dim startInfo As New ProcessStartInfo
startInfo.FileName = execFile
startInfo.Arguments = CmdExe.Replace("#MAQUINA#", txtFiltroMaquina.Text).Replace _
("#USUARIO#", txtUsuario.Text.Trim).Replace _
("#CLAVE#", txtClave.Text.Trim)
Proceso.EnableRaisingEvents = True
startInfo.UseShellExecute = False
startInfo.RedirectStandardOutput = True
startInfo.RedirectStandardError = True
startInfo.CreateNoWindow = False
Proceso.StartInfo = startInfo
Proceso.Start()
Proceso.BeginOutputReadLine()
Proceso.BeginErrorReadLine()
Proceso.WaitForExit()
End Sub
データを処理するデリゲート:
Private Sub CallbackProcesoAsync(sender As Object, args As System.Diagnostics.DataReceivedEventArgs)
If Not args.Data Is Nothing AndAlso Not String.IsNullOrEmpty(args.Data) Then
If Not listtask.InvokeRequired Then
listtask.Items.Add(args.Data.ToString)
Else
Dim d As New TextToControl(AddressOf AddToControl)
listtask.Invoke(d, args.Data.ToString)
End If
End If
End Sub
Private Sub ErrorDataReceivedAsync(sender As Object, args As System.Diagnostics.DataReceivedEventArgs)
If Not args.Data Is Nothing AndAlso Not String.IsNullOrEmpty(args.Data) Then
If Not listtask.InvokeRequired Then
listtask.Items.Add(args.Data.ToString)
Else
Dim d As New TextToControl(AddressOf AddToControl)
listtask.Invoke(d, args.Data.ToString)
End If
End If
End Sub
プログラムが正しく終了していることを確認しました。C#実行可能ファイルには
Enviroment.Exit(0);
実行の最後に