2015-06-19 130 views
8

我想要实现的是一个没有毒性输出的自编译的c#文件。我试图用Console.MoveBufferArea方法实现此目的,但看起来不起作用。例如, - 保存下面的代码.bat扩展:获取没有C#最后一行的控制台缓冲区?

// 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方法)有什么问题吗?我需要PInvoke吗?

+1

难道你不能只使用'Console.Clear();'? – Jashaszun

+0

@Jashaszun - 我甚至可以用'cls'命令批量执行,但如果可能的话,我想保留历史命令。只是因为它会更加流畅。 – npocmaka

+0

这是一个与批处理命令/批处理文件相关的问题,而不是C#...或者? – elgonzo

回答

2

如果你想这样做在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#代码。如果你希望速度更快,你需要找到一个基于控制台/批处理文件的解决方案。另外要记住的是假设提示是单行。如果这是一条跨越两条线的非常长的提示,那么您将会遇到一些混乱,因此根据您计划如何使用它可能会更好地清除两条线。

如果你想整个猪,并开始阅读控制台缓冲区,以确定提示多长时间,那么你可能想看看这个question。虽然答案中的文章链接被破坏,但代码下载似乎仍然有效。

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

+0

谢谢 - 这工作。虽然看起来我也需要尝试一下,如果输出重定向。 – npocmaka