使用 C# 获取不带最后一行的控制台缓冲区

本文关键字:一行 缓冲区 控制台 获取 最后 使用 | 更新日期: 2023-09-27 17:57:07

我试图实现的是一个没有有毒输出的自编译 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
        );
   }
}

输出将是:

C:'>//  2>nul  ||
Hello, C# World!

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

使用 C# 获取不带最后一行的控制台缓冲区

如果要在 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;
}
实质上,将光标向上移动一行(

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

这样做的明显缺点是,在删除// 2>nul ||之前,需要等待编译和执行 C# 代码。 如果您希望它更快,则需要找到基于控制台/批处理文件的解决方案。 要记住的另一件事是假设提示是一行。 如果这是一个跨越两行的很长的提示,那么你会有点混乱,所以最好清除两行,这取决于你打算如何使用它。

如果您想全力以赴

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

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