使用批处理文件生成可执行文件...等什么?

Generating an executable using batch file... WAIT WHAT?

所以大约一年前我在做一个小项目,我正在寻找可以批量拥有动态颜色的东西(例如只改变几个单词的颜色)。我发现了这个:

[CODE INTRO]
call :TXTCOLOR
set COLOR=TXTCOLOR.exe

[CODE]

:TXTCOLOR
    Echo.Const W=^2>t.vbs&Echo.Set o=WScript.StdOut>>t.vbs
    For %%b In (
    "4D53434600000000BA030000000000002C000000000000000301010001000000000000"
    "004900000001000100D20700000000000000009E3B8A662000747874636F6C6F722E65"
    "78650063EB078D6903D207434BDD544B681341189E6D538D35352AE2030F4EC44A458D"
    "55113C88D4C75A85AA5B5A2F8AD66D324997A6BB7177A2297868498B9450ECA182871E"
    "7AF0E0C183878AA98844DA83828288074FE24549B1A00785452AEB3F8F3C5A7C54BD39"
    "F0E77F7FF3CD9FD9397976045523847C209E87500E89D5847EBFFA40566C7AB0024D2C"
    "7B1ECA292DCF43ED5D868393B615B7F51E1CD14DD3A2B893603B6562C3C4474FB7E11E"
    "2B4AC27575B55B2486A622D4A254CDC37D8B82D5CB9525F3624DABE167250896EC985D"
    "25782354D6A851C4A70F237E2E5EB8B25297145F1701EFC022CEFAA76B0C70F7FF221F"
    "A6244D8B644036540BDE950B202E86A33AD5C17EA188C04BA6E78F864D23FFB73CCF0C"
    "BDEB9F6D006324ABFA33AE2F38180016593590C9FBB2FED6C228789969DF903AC7637E"
    "16EB2BC6DCAC3A9771157E6782A3F9C17C7060032A77071F295AE19C289EB9C413505E"
    "5559DEB4B07C872867B97D15B9CC6385A7EBCAE9B5909EA945F2CACE0498C586F3A146"
    "04D80FA7EDFE8CA25FEE995704C53298E865C7630D5F7983CBCC8F254E93EC8F6B9D64"
    "95AD6C28190E12280D6AB2767E3E52CC33D47ED7637CAE8D0BE48C8B8203AB8AB6121C"
    "A86124328CCE17CFF3B44258617C3E0FAB6FB4ACFA592B6C55F830FBDFB24F5684362A"
    "9259207BD21D525F0F3E9530FC544B71139A616EAE062CE8789D455A0E31BBC04E0BCC"
    "82F7D5F702EA45690EEB99E5E75553BCCAC747CCE7F374AA747FD6B0FB9313439BCDB1"
    "0F0FB091025D3778979F776985EB0263589DD578B5360CDB0DAB2EC89C56E8E5D9358C"
    "02CC010462E7BF791E9FDAA7ACFA492B5C1000B0B5573F86D9E5F1EAC7A5BE25F56DA9"
    "A7A57E22F533A9EF487D57EA09A973523FC48B79FBFE9755EFD43B08AE084DD38895B0"
    "EC304913DCA947BAE3B69532A30D8D3B8F6D8B5936A970E181374C7A8A5C69314CD2D0"
    "B86BF736BC997611CC5EB4CDB50BF05FE1B21D08897771AE22761562D3F8C7DCD6410E"
    "836C07D9077210A419A41D8480A442A26E08F44D907BA17FEBEB712E476C1A8E2612E0"
    "38D44E10130CC349478DB841B959B4204B2D56C6671103A3236299D4B612B124733A1C"
    "423BF464B283F626090FC409EDD10D53B7E30EF8240D30DDC4364962EF1EB96333A16D"
    "347A5C37A30922DC2396E95809D216B109310FA76231629F30631624DB4AC97698FA21"
    ) Do >>t.vbs (
    Echo.For b=1To 69Step 2:o.Write Chr(Clng("&H"^&Mid(%%b,b,W^)^)^):Next)
    For %%b In ("4A6DA33345591BFA0E"
    ) Do >>t.vbs (
    Echo.For b=1To 17Step 2:o.Write Chr(Clng("&H"^&Mid(%%b,b,W^)^)^):Next)
    Cscript /Nologo t.vbs > TXTCOLOR.ex_
    Del /f /q /a t.vbs >nul 2>&1
    Expand -r TXTCOLOR.ex_ >nul 2>&1
    Del /f /q /a TXTCOLOR.ex_ >nul 2>&1
    Goto :Eof
:----------------------------------------------

[END]

这会生成一个 .exe,允许我们使用以下语法在批处理文件中更改颜色:

%COLOR% [COLOR CODE] [LINE PARAMETER] "[TEXT]"

[COLOR CODE]是经典的cmd颜色系统,第一个字符是背景id,第二个字符是文本颜色id。 [LINE PARAMETER] 如果不是行的最后一部分则为 0,否则为 1。当然,[TEXT] 是正文。

例如,如果我想用白色的“hello”和“test”写“Hello world test”,用浅绿色写“world”(所有东西都有背景),它应该是这样的:

%COLOR% 0F 0 "Hello "
%COLOR% 0A 0 "world "
%COLOR% 0F 1 "test"

我把 1 放在最后一个,因为它是行尾。

最后,我们来谈谈我的问题:它是如何工作的?我的意思是,使用一个批处理,我们生成一个 .exe 能够用作 CMD 中的命令。但是如何生成一个有效的?

谢谢你至少读到这里,即使你没有任何答案。 祝你有美好的一天 ;)

代码 echo 将大量内容写入 (>>) 文件 t.vbs,即它正在创建一个 VBScript 文件。

然后执行 VBScript 文件 (Cscript /Nologo t.vbs),并将 VBScript 的输出写入 TXTCOLOR.ex_

由于TXTCOLOR.ex_是一个压缩文件,所以Expanded,会给你TXTCOLOR.exe可以执行。

But how to generate one that is working?

如果您想对不同的可执行文件执行相同的操作,只需颠倒步骤顺序即可:

  1. 创建可执行文件
  2. 压缩它以减少字节数
  3. 获取它的十六进制转储
  4. 编写一个可以将十六进制转储转换为二进制文件的 VBScript 文件
  5. 写一个写VBScript文件的批处理文件

但是:如果您只想执行一些代码,您可以立即在可执行文件中实现它。它更不容易出错,也更省力。混淆这样的东西让人怀疑。