2016-07-19 118 views
2

如何使用格式化代碼格式化字符串以使Windows cmd具有格式化字符串?基於控制檯格式化代碼的格式字符串


所以基本上我有一個像~b~Hello World~r~這樣的字符串。

當我輸出到cmd時,它應該顯示爲<blue from here on>Hello World<reset to normal>


至於我knwo,CMD有一定的Unicode字符更改下列文本格式,但我不記得他們(像\u00234


因此,我想到的是:

public string FormatString(string input) 
{ 
    input = Regex.Replace(input, "~b~", "<unicode for blue>", RegexOptions.IgnoreCase); 
    input = Regex.Replace(input, "~r~", "<Unicode for reset>", RegexOptions.IgnoreCase); 
    return input; 
} 
+2

是設置「Console.BackgroundColor」還是「Console.ForegroundColor」,然後調用Console.ResetColor(),如[this](http://stackoverflow.com/questions/6859483/)如何對變化的前景和背景,字體顏色,在控制檯)? –

+0

請不要在Stack Overflow上使用txtspk。例如,「some1」不是英語中的單詞。另外,當提到你自己時,I是大寫的。 –

+0

我們是在堆棧溢出還是語法溢出? – Bluscream

回答

2

據我所知,Windows控制檯應用程序中沒有這樣的控制代碼,如cmd.exe。有一些創造性的方法可以達到類似的結果。其中之一是How to echo with different colors in the Windows command line。我出於好奇而嘗試了它,它工作得很好。它使用了一些jscript魔法。對於日常使用,如果您想要轉義代碼格式化功能,您可能會發現其中一種bash shell模擬器更有用。 (How to develop in Linux-Like Shell (bash) on Windows?

UPDATE:

我扔在一起的東西非常快速和骯髒展示一種方法以類似於您在使用的問題一個一個的風格用「代碼」。這可能不是「最好」的方式。但它可能引發一個想法。

class Program 
{ 
    static void Main(string[] args) 
    { 
     @" 
This is in ~r~red~~ and this is in ~b~blue~~. This is just some more text 
to work it out a bit. ~g~And now a bit of green~~. 
".WriteToConsole(); 
     Console.ReadKey(); 
    } 
} 

static public class StringConsoleExtensions 
{ 
    private static readonly Dictionary<string, ConsoleColor> ColorMap = new Dictionary<string, ConsoleColor> 
    { 
     { "r", ConsoleColor.Red }, 
     { "b", ConsoleColor.Blue }, 
     { "g", ConsoleColor.Green }, 
     { "w", ConsoleColor.White }, 
    }; 
    static public void WriteToConsole(this string value) 
    { 
     var position = 0; 
     foreach (Match match in Regex.Matches(value, @"~(r|g|b|w)~([^~]*)~~")) 
     { 
      var leadingText = value.Substring(position, match.Index - position); 
      position += leadingText.Length + match.Length; 
      Console.Write(leadingText); 
      var currentColor = Console.ForegroundColor; 
      try 
      { 
       Console.ForegroundColor = ColorMap[match.Groups[1].Value]; 
       Console.Write(match.Groups[2].Value); 
      } 
      finally 
      { 
       Console.ForegroundColor = currentColor; 
      } 
     } 
     if (position < value.Length) 
     { 
      Console.Write(value.Substring(position, value.Length - position)); 
     } 
    } 
} 

我認爲可能有一種方法來獲取正則表達式來捕獲前導文本。但是我沒有太多時間去嘗試。我有興趣看看是否有一種模式可以讓正則表達式完成所有的工作。

+0

嗯,這聽起來像我必須開發一個系統來拆分字符串那裏,並使用控制檯。爲它的每個部分寫():c – Bluscream

+0

您原來的文章使得它聽起來像您想要的(ANSI)轉義代碼,您可以在cmd.exe中運行自己的腳本。但現在看起來更像是你正在開發一些東西供其他人使用。在這種情況下,您可以輕鬆創建一些可以模擬代碼的擴展或實用程序。但是它總是歸結爲設置BG和FG顏色,然後編寫一個字符串,除了其他註釋中提到的情況(例如Windows 10)。如果這是一個C#應用程序打算作爲控制檯應用程序運行,那麼我可能會有一個擴展的例子。 – rhaben

2

我想你說的是ANSI轉義代碼。你可以閱讀關於他們here

基本上你只是將ESCAPE字符('\ x1b'作品)發送到控制檯,然後是一個'['字符。然後你發送你想要的顏色值,然後輸入'm'。

喜歡的東西:

Console.WriteLine("\x1b[31mRed\x1b[0;37m"); 

Windows控制檯的支持是相當有限,除非你明確地打開它。我相信Windows 10支持ANSI轉義代碼。

+0

對不起,我不得不爲你撤銷'最佳答案',但我只是測試它,並沒有奏效。 [截圖](http://prntscr.com/bv9f8j) – Bluscream

+0

好處是,它在conEMU [截圖](http://prntscr.com/bv9iyy)中工作,但因爲我想發佈這個作爲服務器應用程序我需要另一種方案 – Bluscream