1

アプリケーションからの出力/エラーのリダイレクトに関する 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);

実行の最後に

4

2 に答える 2

1

OK、実行後に psexec と私の c# アプリケーションの間のすべての出力を取得するために見つけた最善の回避策は次のとおりです。

Dim CmdExe As String ="\#MAQUINA# -u #USUARIO# -p #CLAVE# -s -c -f """ + executionPath + """ > outputFileCode.txt"

これにより、何かを変更したり、プログラムを直接呼び出したりすることなく、標準出力を解析できます。

于 2012-12-03T10:33:52.083 に答える
0

コンソール ウィンドウに表示されるのは、psexec と子プロセスの両方によってコンソールに送信された出力の組み合わせです。psexec からの出力をインターセプトできますが、子に対して同じことを行うには、psexec にインターセプト コードが必要です。

仲介者を削除してみてください-実行可能ファイルを直接呼び出します

于 2012-11-30T19:03:20.207 に答える