2010-08-10 19 views
2

我剛開始使用Nant進行構建和測試。當它失敗時,我想讓它改變我的命令提示符文本的顏色(或背景),因此很容易被注意到。如何在NAnt腳本中運行'color'命令

Windows上的命令提示符中的命令是「顏色4」,將其更改爲紅色,將顏色7更改爲白色。

如何在構建腳本中執行此操作,echo不起作用,exec不起作用(儘管可能會使用exec錯誤)。我寧願不必運行perl等只是做一些在標準命令提示符窗口中輕鬆完成的任務。

有誰知道如何做到這一點?

回答

4

嘗試使用自定義任務。如果該任務包含在nant文件中,則不會有任何外部依賴關係。

<project > 

    <target name="color"> 
     <consolecolor color="Red" backgroundcolor="White"/> 
     <echo message="red text"/> 
     <consolecolor color="White" backgroundcolor="Black"/> 
     <echo message="white text"/> 
    </target> 

    <script language="C#"> 
     <code> 
      [TaskName("consolecolor")] 
      public class TestTask : Task 
      { 
      private string _color; 
      private string _backgroundColor; 

      [TaskAttribute("color",Required=true)] 
      public string Color 
      { 
      get { return _color; } 
      set { _color = value; } 
      } 

      [TaskAttribute("backgroundcolor",Required=false)] 
      public string BackgroundColor 
      { 
      get { return _backgroundColor; } 
      set { _backgroundColor = value; } 
      } 

      protected override void ExecuteTask() 
      { 
      System.Console.ForegroundColor = (System.ConsoleColor) Enum.Parse(typeof(System.ConsoleColor),Color); 
      System.Console.BackgroundColor = (System.ConsoleColor) Enum.Parse(typeof(System.ConsoleColor),BackgroundColor); 
      } 
      } 
     </code> 
    </script> 

</project> 
+0

完美!謝謝Martin – RodH257 2010-08-12 01:05:19

+0

設置好背景色後,可以添加try {System.Console.Clear();} catch(){}。 1.這將清除屏幕並將整個背景設置爲相同的顏色。你一眼就可以看到構建失敗。 2.該批處理是在批處理文件重定向時處理的。 – 2013-07-20 15:39:53

2

作爲後續行動,以通過@馬丁 - Vobr我對發表的留言:

我已經添加了額外的邏輯來適當地改變背景。這將允許在命令窗口中啓動構建,然後一眼就可以檢查進度。 「建築」使用藍色背景,「成功」使用綠色,「失敗」使用紅色。

<!-- http://stackoverflow.com/questions/3446135/how-to-run-color-command-in-nant-script --> 
    <!-- Sample: <consolecolor color="Red" backgroundcolor="White"/> --> 
    <!-- Alternative: http://riccardotramma.com/2011/05/nantcolours-v1-0-a-task-library-for-output-colouring-in-nant/ --> 
    <script language="C#"> 
     <code> 
     <![CDATA[ 
      [TaskName("consolecolor")] 
      public class TestTask : Task 
      { 
       private string _color; 
       private string _backgroundColor; 

       [TaskAttribute("color",Required=true)] 
       public string Color 
       { 
        get { return _color; } 
        set { _color = value; } 
       } 

       [TaskAttribute("backgroundcolor",Required=false)] 
       public string BackgroundColor 
       { 
        get { return _backgroundColor; } 
        set { _backgroundColor = value; } 
       } 

       protected override void ExecuteTask() 
       { 
        System.Console.ForegroundColor = (System.ConsoleColor) Enum.Parse(typeof(System.ConsoleColor),Color); 
        System.Console.BackgroundColor = (System.ConsoleColor) Enum.Parse(typeof(System.ConsoleColor),BackgroundColor); 
        // clearing the screen sets the entire screen to be the new color 
        ChangeColor((System.ConsoleColor) Enum.Parse(typeof(System.ConsoleColor),Color), (System.ConsoleColor) Enum.Parse(typeof(System.ConsoleColor),BackgroundColor)); 
       } 

       // added by Brad Bruce 
       // http://stackoverflow.com/questions/6460932/change-entire-console-background-color-win32-c 

       [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
       static extern bool ReadConsoleOutputAttribute(IntPtr hConsoleOutput, 
        [System.Runtime.InteropServices.Out] ushort[] lpAttribute, uint nLength, COORD dwReadCoord, 
        out uint lpNumberOfAttrsRead); 

       [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
       static extern bool FillConsoleOutputAttribute(IntPtr hConsoleOutput, 
        ushort wAttribute, uint nLength, COORD dwWriteCoord, out uint 
        lpNumberOfAttrsWritten); 

       [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] 
       public struct COORD { 
        public short X; 
        public short Y; 

        public COORD(short X, short Y) { 
         this.X = X; 
         this.Y = Y; 
        } 
       }; 

       [System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)] 
       static extern IntPtr GetStdHandle(int nStdHandle); 

       //C#: Get stdout handle 
       const int STD_OUTPUT_HANDLE = -11; 
       const int STD_INPUT_HANDLE = -10; 
       const int STD_ERROR_HANDLE = -12; 
       //INVALID_HANDLE_VALUE //(return value if invalid handle is specified) 

       // http://msdn.microsoft.com/en-us/library/windows/desktop/ms682088(v=vs.85).aspx#_win32_character_attributes 

       public enum CharacterAttributes{ 
        FOREGROUND_BLUE = 0x0001, 
        FOREGROUND_GREEN = 0x0002, 
        FOREGROUND_RED = 0x0004, 
        FOREGROUND_INTENSITY = 0x0008, 
        BACKGROUND_BLUE = 0x0010, 
        BACKGROUND_GREEN = 0x0020, 
        BACKGROUND_RED = 0x0040, 
        BACKGROUND_INTENSITY = 0x0080, 
        COMMON_LVB_LEADING_BYTE = 0x0100, 
        COMMON_LVB_TRAILING_BYTE = 0x0200, 
        COMMON_LVB_GRID_HORIZONTAL = 0x0400, 
        COMMON_LVB_GRID_LVERTICAL = 0x0800, 
        COMMON_LVB_GRID_RVERTICAL = 0x1000, 
        COMMON_LVB_REVERSE_VIDEO = 0x4000, 
        COMMON_LVB_UNDERSCORE = 0x8000 
       } 

       static void ChangeColor(System.ConsoleColor color, System.ConsoleColor backgroundColor) { 
        uint written = 0; 
        COORD writeCoord = new COORD(0, 0); 
        ushort[] attribute = new ushort[400]; 

        IntPtr consoleOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE); 

        int consoleBufferWidth = Console.BufferWidth; 
        int consoleBufferLength = Console.BufferHeight; 
        //if (consoleBufferLength > Console.CursorTop) { 
        // consoleBufferLength = Console.CursorTop; 
        //} 

        for (int y = 0; y < consoleBufferLength; y++)  // rows 
        { 
         writeCoord.X = (short)0; 
         writeCoord.Y = (short)y; 
         ReadConsoleOutputAttribute(consoleOutputHandle, attribute, (uint)consoleBufferWidth, writeCoord, out written); 

         for (int x2 = 0; x2 < consoleBufferWidth; x2++){ // columns 
          attribute[x2] &= 0xFF00; // zero the background and foreground color 
          attribute[x2] |= (ushort)((((int)backgroundColor) << 4) | (int)color); 
         } 
         FillConsoleOutputAttribute(consoleOutputHandle, attribute[0], (uint)consoleBufferWidth, writeCoord, out written); 
        } 
       } 
      } 
     ]]> 
     </code> 
    </script>