我想要实现的是一个没有有毒输出的自编译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吗?
如果您想在 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 ||删除。如果您希望它更快,您需要找到基于控制台/批处理文件的解决方案。另一件要记住的事情是假设提示是一行。如果这是一个跨越两行的非常长的提示,那么您会变得有点混乱,因此最好清除两行,具体取决于您计划如何使用它。
如果您想全力以赴并开始读取控制台缓冲区以确定提示的长度,那么您可能想看看这个问题。虽然答案中的文章链接已损坏,但代码下载似乎仍然有效。
如果您想采用基于批处理文件的方法,那么您可能想看看这个问题。