使用C#获取没有最后一行的控制台缓冲区?

npo*_*aka 8 c#

我想要实现的是一个没有有毒输出的自编译c#文件.我正在尝试使用Console.MoveBufferArea方法实现这一点,但看起来不起作用.例如.- 使用.bat扩展名保存下面的代码:

// 2>nul||@goto :batch
/*
:batch
@echo off
setlocal

:: find csc.exe
set "frm=%SystemRoot%\Microsoft.NET\Framework\"
for /f "tokens=* delims=" %%v in ('dir /b /a:d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\v*"') do (
   set netver=%%v
   goto :break_loop
)
:break_loop
set csc=%frm%%netver%\csc.exe
:: csc.exe found
%csc% /nologo /out:"%~n0.exe" "%~dpsfnx0" 
%~n0.exe
endlocal
exit /b 0
*/
public class Hello
{
   public static void Main() {
      ClearC();
      System.Console.WriteLine("Hello, C# World!");
   }

   private static void ClearC() {
        System.Console.MoveBufferArea(
            0,0,
            System.Console.BufferWidth,System.Console.BufferHeight-1,
            0,0
        );
   }
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

C:\>//  2>nul  ||
Hello, C# World!
Run Code Online (Sandbox Code Playgroud)

想要摆脱的是 // 2>nul ||什么呢.有可能吗?我的逻辑(ClearC方法)有什么问题吗?我需要PInvoke吗?

for*_*rir 3

如果您想在 C# 中执行此操作,则将ClearC函数更改为以下内容似乎可行:

public static void ClearC() {
    System.Console.CursorTop = System.Console.CursorTop - 1;
    System.Console.Write(new string(' ', System.Console.BufferWidth));
    System.Console.CursorTop = System.Console.CursorTop - 1;
}
Run Code Online (Sandbox Code Playgroud)

本质上,将光标向上移动一行(到应包含提示的行),清空整行,然后向上移动另一行(这应将您移动到命令之间的空行)。未来的输出将从这里开始。

这样做的明显缺点是您需要等待 C# 代码编译并执行,然后才能// 2>nul ||删除。如果您希望它更快,您需要找到基于控制台/批处理文件的解决方案。另一件要记住的事情是假设提示是一行。如果这是一个跨越两行的非常长的提示,那么您会变得有点混乱,因此最好清除两行,具体取决于您计划如何使用它。

如果您想全力以赴并开始读取控制台缓冲区以确定提示的长度,那么您可能想看看这个问题。虽然答案中的文章链接已损坏,但代码下载似乎仍然有效。

如果您想采用基于批处理文件的方法,那么您可能想看看这个问题