偶然发现一首晦涩难懂的中文诗歌(BAT文件)
刚刚发生了一件非常奇怪的事情。我在批处理文件中运行了这段代码:
wmic timezone get caption>>tmp_ist.bak
time/date>>tmp_ist.bak
这是偶然的,时间/日期是我自己为 %TIME%>> 做的笔记,无论如何,批处理文件停止了,我查看了 .bak 文件,然后:
图片说明 (UTC+09:30) 阿德莱德
桔祳瑳浥挠湡潮⁴捡散拾琠敨琠浩湥整敲湅整桴敮⁷楴敭›
...变得更加奇怪,这意味着:
橘祳瑳絣刮起潮水⁴捡起散落的玫瑰撒下宝藏琠浩ṥṣṣṣṣṇṣṣṣ�
它触发了time
命令并尝试输入/date
,完成后(在提示中)它会说:
The system cannot accept the time entered.
措辞不太优雅。我完全不知道发生了什么!
问题是由于混合使用
wmic
始终以默认输出格式输出 UTF-16 文本桔祳瑳浥挠湡潮⁴捡散瑰琠敨琠浩湥整敲湅整桴敮⁷楴敭›
使用 UTF-16 (LE) 编码时会U+6854 U+2065 U+7973 U+7473 U+6D65 U+6320 U+6E61 U+6F6E U+2074 U+6361 U+6563 U+7470 U+7420 U+6568 U+7420 U+6D69 U+2065 U+6E65 U+6574 U+6572 U+2E64 U+0A0D U+6E45 U+6574 U+2072 U+6874 U+2065 U+656E U+2077 U+6974 U+656D U+203A
产生以下字节序列当将相同的字节序列作为 ASCII 处理时,它变成
这里我使用 PowerShell 来演示,结果
time
如下:然而,输出始终是 UTF-16,这就是为什么开头
wmic
会有FF FE
BOM 签名。当你将输出附加time
到该文件时,由于编码错误,它变成了完全垃圾。ANSI 输出被处理为 UTF-16,导致结果类似于Bush hid the facts漏洞。在问题中,你只显示了,
>>
但它的初始输出可能来自wmic
您可以使用一些技巧,例如上面提到的管道
more
将wmic
输出转换为 ANSI无论如何,wmic 很久以前就被弃用了,应该使用新的 PowerShell cmdlet
事实并非如此,因为可以根据您的选择以不同的编码
wmic
提供输出。/format
这不仅关乎使用
wmic
,还关乎在后面放置什么/format:[here]
。不同的格式选项会导致不同的输出编码,这会影响结果的处理方式。输出方式可能会使字符串处理变得更容易或更困难,具体取决于您将它发送到哪里或如何使用它。
简单的格式通常更易于在脚本中读取和解析,而结构化的格式可能更适合在程序中使用,即使它们需要处理 UTF-16 之类的编码。同样,这完全取决于具体场景以及你对输出的操作。
.\"tmp_ist.bak"
: