未显示控制台应用程序输出

时间:2012-11-30 18:41:01

标签: vb.net asynchronous psexec

我在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#Console应用程序的原因 输出没有出现:

我发布的命令是:

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);

执行结束时

2 个答案:

答案 0 :(得分:0)

您在控制台窗口中看到的是由psexec和子进程发送到控制台的混合输出。你可以拦截psexec的输出,但为了孩子这样做需要psexec中的拦截代码,显然它没有

尝试删除中介 - 直接调用您的可执行文件

答案 1 :(得分:0)

好的,我发现最好的解决方法是在psexec和我的c#应用程序之间获得所有输出 执行后是:

  

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

这允许我解析标准输出而无需改变任何东西或调用 我的程序直接,因为我不能这样做。

相关问题