1

我在 StackOverflow 中阅读了几个关于从应用程序重定向输出/错误的问题,但它对我没有帮助。

我用 C# 代码开发了一个可执行文件。它从系统注册表中恢复软件并调用 Web 服务将其保存到我们的数据库中。

在可执行文件中,我们正在打印消息

Console.WriteLine("来自可执行文件的消息");

另一方面,我们有一个 CRM 应用程序,我编写了两个 win 表单,它们使用所需的参数调用 psexec.exe,这个 .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

好的,我发现在执行后获得 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 回答