![Shell 脚本和文本文件输出类型 RE: msinfo32](https://linux22.com/image/732563/Shell%20%E8%84%9A%E6%9C%AC%E5%92%8C%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E8%BE%93%E5%87%BA%E7%B1%BB%E5%9E%8B%20RE%3A%20msinfo32.png)
我在 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。