gpt4 book ai didi

.net - AttachConsole() 显示管道上的数据,但 > 运算符未正确重定向到文件

转载 作者:行者123 更新时间:2023-12-01 20:11:04 27 4
gpt4 key购买 nike

我制作了一个在 .NET Framework 4.0 上运行的 WinForms 应用程序。在调用(启动时一次)Win32 API 函数 AttachConsole(-1) 后,它使用 Console.WriteLine() 方法在父控制台上写入。

只要我只需要在屏幕上显示输出,它就可以完美地工作。不幸的是,当我使用带有管道重定向运算符的批处理时,如下所示:

application.exe > output.txt

它只是创建一个空文件。当我使用 AttachConsole 时,可能存在与正在解决的实际管道相关的问题?为什么命令提示符无法捕获数据并将其放入文件中?有谁知道与这种情况相关的任何问题吗?

最佳答案

Console.Out 是延迟初始化的。第一次引用它时,运行时会调用 GetStdHandle(STD_OUTPUT_HANDLE) 来获取标准输出句柄。如果此调用发生在调用 AttachConsole 之前,您将获得用于重定向的文件句柄。如果此调用之后发生,您将获得控制台输出句柄。

以下类修复了标准输出和错误句柄。如果您从控制台启动应用程序,您会注意到在下一个提示后会出现任何输出。您可以通过 start/wait 避免这种情况。

using System;
using System.Runtime.InteropServices;

namespace SomeProject
{
class GuiRedirect
{
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool AttachConsole(int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(StandardHandle nStdHandle);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetStdHandle(StandardHandle nStdHandle, IntPtr handle);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern FileType GetFileType(IntPtr handle);

private enum StandardHandle : uint
{
Input = unchecked((uint)-10),
Output = unchecked((uint)-11),
Error = unchecked((uint)-12)
}

private enum FileType : uint
{
Unknown = 0x0000,
Disk = 0x0001,
Char = 0x0002,
Pipe = 0x0003
}

private static bool IsRedirected(IntPtr handle)
{
FileType fileType = GetFileType(handle);

return (fileType == FileType.Disk) || (fileType == FileType.Pipe);
}

public static void Redirect()
{
if (IsRedirected(GetStdHandle(StandardHandle.Output)))
{
var initialiseOut = Console.Out;
}

bool errorRedirected = IsRedirected(GetStdHandle(StandardHandle.Error));
if (errorRedirected)
{
var initialiseError = Console.Error;
}

AttachConsole(-1);

if (!errorRedirected)
SetStdHandle(StandardHandle.Error, GetStdHandle(StandardHandle.Output));
}
}
}

关于.net - AttachConsole() 显示管道上的数据,但 > 运算符未正确重定向到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11523595/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com