Shell 脚本和文本文件输出类型 RE: msinfo32

Shell 脚本和文本文件输出类型 RE: msinfo32

我在 Windows 10 命令提示符中运行了以下脚本msinfo32 /report mysystem.txt,它将机器的所有系统数据保存在一个文本文件中。

但是,当我在输出文本文件上运行字符串时,我没有得到任何输出。 findstr /c:"System Name" mysystem.txt应该显示系统名称,但它没有返回任何内容。我打开了文件,所有文本都在那里,但 findstr 无法识别它。

最后,我将文件扩展名改为 .csv,在 excel 中打开它,并将其保存为“Text(MS-DOS).txt”文件。不要问我为什么会想到这样做,我只是在瞎想。然后,我成功地在保存为“Text(MS-DOS).txt”文件的文件上运行字符串。

有人能解释一下这种现象吗?我认为只要是纯文本,文本文件就是文本文件。如何让命令行以 Text(MS-DOS).txt 格式直接输出。我在 findstr 中找不到这个选项,谷歌搜索也没有找到任何结果。

在此先感谢您的帮助。

答案1

这可能是因为结果mysystem.txt被编码为UTF-16. 在 Unix 系统上文件实用性可用于证明:

$ 文件 mysystem.txt
mysystem.txt:Little-endian UTF-16 Unicode 文本,行很长,带有 CRLF、CR 行终止符

因此,对于纯文本实用程序来说,findstr该文件mysystem.txt实际上看起来像这样:

$ cat -v mysystem.txt | head -1 | cut -c-80
M-^?M-~S^@y^@s^@t^@e^@m^@ ^@I^@n^@f^@o^@r^@m^@a^@t^@i^@o^@n^@ ^@r^@e^@p^@o^@r^@t

其他工具可能能够理解UTF-16:

$ head -1 mysystem.txt | cut -c-80
��系统信息报告写于: 0

我不知道为什么msinfo32决定写出 UTF-16 文件,也许它想要确保真正捕获世界各地所有 Windows 安装的所有(系统)信息(其中 UTF-8 是不够的),并且我没有找到强制msinfo32使用不同字符集的开关。

可能有 Windows 命令行工具可以将文件转换为不同的字符集,但我不知道。因此,这里再次提供了一个 Linux 代码片段来执行此操作:

$ iconv -f UTF16LE -t UTF8 mysystem.txt -o mysystem_8.txt

现在可以将生成的mysystem_8.txt文件输入到findstr

$ findstr /c:"系统名称" mysystem_8.txt
系统名称:WIN11
系统名称 WIN11

在 Windows 中,可以使用 打开文件notepad.exe,再次保存文件(“另存为”),然后在Save file对话框中选择其他编码(UTF-8 或 ANSI)。但我不知道有哪个 Windows 命令行工具可以执行相同的操作。操作系统可以解决问题,但首先必须安装它。

答案2

您遇到此问题的原因是 msinfo32 以 UCS-2 Little Endian 格式对文本文件进行编码,而 findstr 不支持 UCS-2 编码。当您在 excel 中打开文本文件并重新保存文档时,它会以 findstr 支持的 UTF-8 编码文件。此问题的解决方法如下:

msinfo32 /report mysystem.txt
type mysystem.txt > utf8.txt
findstr /c:"System Name" utf8.txt

类型命令将在屏幕上显示一个文本文件,但是当使用 > 字符时,它会将该输出重定向到以 UTF-8 编码的文本文件。

如果您只是想获取机器名称,可以运行以下命令:

hostname

检索系统信息的更优雅的方式是通过 powershell,它允许您检索使用 msinfo32 可以检索的所有内容以及更多内容。只需在 Google 上搜索您要查找的库存项目和 powershell。例如,搜索 get hostname powershell。

相关内容