是否可以使用批处理编程在命令提示符上输出当前颜色代码?

Tho*_*ick 3 windows cmd batch-file

我正在使用批处理编程为我的朋友制作一个教程程序。我想知道是否有可能在文件中编写代码来显示当前颜色代码。

示例是颜色当前设置为 0A,我希望显示在行上说:

echo The color is currently set to 0A.

我希望我的文件读取设置的代码并显示它以帮助他们记住他们所做的更改,因为这是命令提示符/批处理中颜色代码的示例程序。

感谢您的帮助!

小智 5

编写自己的命令来执行此操作很容易。下面的文本文件复制到两者GetConsoleColour.batGetConsoleColour.vb在同一个文件夹中。双击批处理文件,它将创建GetConsoleColour.exe.

PS Color拼写适合我的文化。在我编写它时,我认为没有必要使用在编程中通常必须使用的美式拼写。

请参阅https://docs.microsoft.com/en-us/windows/console/getconsolescreenbufferinfo

GetConsoleColour.exe以十六进制打印当前的控制台颜色并返回一个带有值的错误级别

使用

C:\PathToFile\GetConsoleColour
Run Code Online (Sandbox Code Playgroud)

我这里有一个程序可以逐行设置文本颜色。这是唯一适用于所有 Windows 计算机的技术。

命令提示符脚本:批处理文件中存在多种颜色的问题

还有一个类似的程序,说明此控制台窗口中有多少进程 - ListConsole.exe 列出当前控制台中的进程并返回错误级别,说明有多少。https://winsourcecode.blogspot.com/2019/05/listconsoleexe-list-processes-in.html


REM GetConsoleColour.bat
REM This file compiles GetConsoleColour.vb to GetConsoleColour.exe
REM GetConsoleColour.exe prints the current console colour and returns an errorlevel with the value
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:exe /out:"%~dp0\GetConsoleColour.exe" "%~dp0\GetConsoleColour.vb" 
pause
Run Code Online (Sandbox Code Playgroud)

注意:这里只有 4 行代码。其余的只是程序执行这 4 行所需的信息。在大型程序中,它们将隐藏在单独的文件中。

'GetConsoleColour.vb
Imports System
Imports System.IO
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Public Module MyApplication 

Public Declare Function GetStdHandle Lib "kernel32" Alias "GetStdHandle" (ByVal nStdHandle As Long) As Long
Public Declare Function SetConsoleTextAttribute Lib "kernel32" Alias "SetConsoleTextAttribute" (ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long
Public Declare Function GetConsoleScreenBufferInfo Lib "kernel32" (ByVal hConsoleOutput As Integer, ByRef lpConsoleScreenBufferInfo As CONSOLE_SCREEN_BUFFER_INFO) As Integer
Public Const STD_ERROR_HANDLE = -12&
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&

 <StructLayout(LayoutKind.Sequential)> _
Public Structure COORD
    Public x As Short
    Public y As Short
End Structure

 <StructLayout(LayoutKind.Sequential)> _
Public Structure SMALL_RECT
    Public Left As Short
    Public Top As Short
    Public Right As Short
    Public Bottom As Short
End Structure

 <StructLayout(LayoutKind.Sequential)> _
Public Structure CONSOLE_SCREEN_BUFFER_INFO
    Public dwSize As COORD
    Public dwCursorPosition As COORD
    Public wAttributes As Integer
    Public srWindow As SMALL_RECT
    Public dwMaximumWindowSize As COORD
End Structure 


Sub Main()
    Dim hOut as IntPtr
    Dim Ret as Integer
    Dim CSBI as Console_Screen_Buffer_Info
    hOut  = GetStdHandle(STD_OUTPUT_HANDLE)
    Ret = GetConsoleScreenBufferInfo(hOut, CSBI)
    Console.Writeline(Hex(CSBI.wAttributes))
    Environment.ExitCode = CSBI.wAttributes
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)