roo*_*oot 8 windows batch wmic
在为我的网络创建审计工具时,我发现 WMIC 输出时每个字符之间都有空格,同时伴有回显常规文本。例如,
这个:
@echo off
echo Foo >> "C:\test.txt"
wmic CPU Get AddressWidth >> "C:\test.txt"
wmic CPU Get Description >> "C:\test.txt"
Run Code Online (Sandbox Code Playgroud)
返回这个:
Foo
A d d r e s s W i d t h
6 4
D e s c r i p t i o n
I n t e l 6 4 F a m i l y 6 M o d e l 6 9 S t e p p i n g 1
Run Code Online (Sandbox Code Playgroud)
如果我删除 ( rem) 该echo Foo行,输出的格式会很好,因为只有一种输出类型:
AddressWidth
64
Description
Intel64 Family 6 Model 69 Stepping 1
Run Code Online (Sandbox Code Playgroud)
我读到这是因为 WMIC 输出到 UNICODE,而标准批处理命令输出到 ANSI。两者可以合并以共享通用格式吗?有人可以更深入地解释不同的格式类型,为什么 WMIC 会输出到不同的类型,和/或任何其他影响此输出的因素?我找到了一些面包屑,但没有什么具体的。
wmz*_*wmz 11
从Wmicthrough管道输出more:
wmic CPU Get AddressWidth |more >> "C:\test.txt"
编辑更多背景:您看到的问题是由于wmic输出为 unicode utf-16。这意味着每个字符(或更准确地说,它们中的大多数)都以两个字节进行编码。wmic还在输出的开头放置了一个所谓的 BOM(字节顺序标记)。请参阅下面的字节内容:
FF FE 44 00 65 00 73 00-63 00 72 00 69 00 70 00 ..D.e.s.c.r.i.p.
前两个字节 (FF FE) 指定 UTF-16 的字节序,并允许数据处理工具识别编码 [作为 UTF-16 小端序]。
显然type会进行此检查,如果找到 BOM,则会正确识别编码。
另一方面,如果您首先 echo text然后附加Wmic输出 - 开头没有 BOM,您可以看到不一致的编码:
74 65 78 74 20 0D 0A 44-00 65 00 73 00 63 00 72 text ..D.e.s.c.r
如果你通过type它无法推断出如何解释,/最有可能/假设单字节('ANSI'),这会导致为不可打印字符产生空格(零,实际上是两字节字符编码的高位字节)。
more 处理更多(双关语)情况并为基本 ASCII 字符生成正确的输出,这就是为什么它通常用作此目的的 hack 的原因。
一个额外的注意事项:一些编辑器(记事本是最简单的例子)会正确显示 utf-16 编码的文件,如果它是一致的——即使没有 BOM。有一种方法可以强制echo产生 unicode 输出(但要注意它不会产生 BOM) - 使用内部命令的cmd /u原因输出为unicode。
我真的不能说为什么 cmd unicode 支持如此有限(或者正如大多数人所说 - 坏了......) - 可能是历史/兼容性问题。
最后一件事 - 如果您需要更好的 unicode 支持(以及许多其他好处),我建议您迁移到 powershell