控制台应用程序输出未显示
Posted
技术标签:
【中文标题】控制台应用程序输出未显示【英文标题】:Console Application output is not shown 【发布时间】:2012-11-30 18:41:01 【问题描述】:我在 *** 中阅读了几个关于重定向输出/错误的问题 来自应用程序,但它对我没有帮助。
我用 C# 代码开发了一个可执行文件。它从系统注册表中恢复软件 并调用网络服务将其保存到我们的数据库中。
在可执行文件中,我们使用
打印消息Console.WriteLine("来自可执行文件的消息");
另一方面,我们有一个 CRM 应用程序,我写了两个赢取表格 使用所需参数调用 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);
在执行结束时
【问题讨论】:
【参考方案1】:好的,我发现在 psexec 和我的 c# 应用程序之间获取所有输出的最佳解决方法 执行后是:
将 CmdExe 调暗为字符串 ="\#MAQUINA# -u #USUARIO# -p #CLAVE# -s -c -f """ + executionPath + """ > outputFileCode.txt"
这让我无需更改任何内容或调用即可解析标准输出 直接我的程序,因为我做不到。
【讨论】:
【参考方案2】:您在控制台窗口中看到的是由 psexec 和子进程发送到控制台的混合输出。您可以截取 psexec 的输出,但要对孩子做同样的事情,则需要 psexec 中的截取代码,显然它没有
尝试删除中介 - 直接调用您的可执行文件
【讨论】:
我试图调用 "cmd.exe /c "c:\myprogram" 作为 cmd.exe 给我输出但应用程序挂起的那个。这必须是可能的。我不能使用 ps exec :/ 的其他东西 +50 赏金给你,因为你是唯一一个尝试并回答的人以上是关于控制台应用程序输出未显示的主要内容,如果未能解决你的问题,请参考以下文章
Azure WebJobs (3.x) 连续作业未在仪表板中显示函数