MSInfo32: 生成Windows系统报告的简便方法

你曾经为在计算机系统上创建系统信息报告而苦恼吗?收集系统详细信息可能看起来很困难,但Microsoft System Information Tool(MSInfo32)可以快速收集所有这些信息!

在这篇文章中,您将迅速掌握生成和查看系统信息报告的方法。继续阅读以了解更多信息!

先决条件

对于本教程,您可以使用任何版本的Windows 10。从命令行读取系统报告需要PowerShell。本教程使用Windows 10版本21H1构建19043和PowerShell v7.1。

查看系统信息报告

检索有关系统的详细信息的第一步是打开MSInfo32工具。

要找到该工具,请在开始菜单中搜索MSInfo32,并确保单击以管理员身份运行选项。

当MSInfo32未以管理员身份运行时,它无法正确更新其内部信息缓存,有些驱动程序可能会显示为停止,而实际上并非如此。

一旦工具打开,它将呈现给您一个报告,一个自动生成的报告。您将在系统摘要视图中看到计算机的硬件摘要。在左侧,您将看到各个部分的分类,进一步细分每个部分。

Viewing the System Summary in MSInfo32.

保存MSInfo32报告

也许您正准备对系统进行硬件更改,并希望保存系统信息报告以供以后比较或报告。使用MSInfo32,您有两个选项可以保存该信息:保存和导出。接下来您将了解它们。

您可以点击文件 → 保存将信息保存为一个名为NFO的文件,也就是系统信息文件。NFO文件是基于XML的文件,稍后可以由MSInfo32工具打开以在相同的组织格式中查看。

Saving a System Information report as an NFO file.

下面是NFO XML文件的示例。

<?xml version="1.0"?>
<MsInfo>
  <Metadata>
    <Version>8.0</Version>
    <CreationUTC>08/12/21 02:09:47</CreationUTC>
  </Metadata>
  <Category name="System Summary">
    <Data>
      <Item><![CDATA[OS Name]]></Item>
      <Value><![CDATA[Microsoft Windows 10 Education]]></Value>
    </Data>
    <Data>
      <Item><![CDATA[Version]]></Item>
      <Value><![CDATA[10.0.19043 Build 19043]]></Value>
    </Data>
    <Data>
      <Item><![CDATA[Other OS Description ]]></Item>
      <Value><![CDATA[Not Available]]></Value>
    </Data>
    <Data>
      <Item><![CDATA[OS Manufacturer]]></Item>
      <Value><![CDATA[Microsoft Corporation]]></Value>
    </Data>
    <Data>
      <Item><![CDATA[System Name]]></Item>
      <Value><![CDATA[ASPIREBOX]]></Value>
    </Data>
    <Data>
      <Item><![CDATA[System Manufacturer]]></Item>
      <Value><![CDATA[Acer]]></Value>
...

您也可以点击文件 → 导出,将信息保存为TXT纯文本文件,这样可能更容易阅读,但不能稍后通过系统信息工具打开。

Saving a Syst

下面您将看到MSInfo32导出的文本文件格式的示例。

System Information report written at: 08/11/21 23:33:55
System Name: ASPIREBOX
[System Summary]

Item	Value	
OS Name	Microsoft Windows 10 Education	
Version	10.0.19043 Build 19043	
Other OS Description 	Not Available	
OS Manufacturer	Microsoft Corporation	
System Name	ASPIREBOX	
System Manufacturer	Acer	
System Model	Aspire A514-54	
System Type	x64-based PC	
System SKU	0000000000000000	
Processor	11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz, 2419 Mhz, 4 Core(s), 8 Logical Processor(s)	
BIOS Version/Date	Insyde Corp. V1.12, 5/26/2021	
SMBIOS Version	3.3	
Embedded Controller Version	1.12	
BIOS Mode	UEFI	
BaseBoard Manufacturer	TGL	
BaseBoard Product	Lily_TL	
BaseBoard Version	V1.12	
Platform Role	Mobile	
Secure Boot State	On	
PCR7 Configuration	Elevation Required to View	
Windows Directory	C:\WINDOWS	
System Directory	C:\WINDOWS\system32	
Boot Device	\Device\HarddiskVolume1	
Locale	Brazil

从MSInfo32导出报告的脚本

现在您知道如何从MSInfo32生成系统信息报告,那么您将如何从命令行生成NFO或TXT报告呢?也许您正在创建一个脚本,需要一种快速的方式来检索硬件信息。

以下是使用命令行生成NFO和TXT报告的两种不同选项。

您可以找到大量关于MSInfo32的过时文章,在其中可能会看到诸如/categories/category/pch/showcategories之类的选项。这些选项仅适用于Windows XP,不适用于Windows 10。

这个第一个例子演示了在运行命令的同一目录中生成TXT报告,正如你在下面的截图中所看到的。

MSInfo32 /report report.txt

即使在命令行中运行时,也会弹出一个窗口,你可以在其中看到系统信息在生成报告之前被刷新。

Exporting a System Information report as a TXT file on the command line. Notice the window that pop

这个第二个例子演示了生成NFO报告,这次是通过指定报告将被保存的目录来完成的。请注意,在运行命令之前,目录必须存在。否则,它将悄悄失败。

MSInfo32 /nfo c:\ata\report.nfo

虽然任何文件扩展名都可以使用,因为系统信息报告导出是一个NFO文件,/nfo选项,习惯上使用.nfo作为报告的扩展名。

通过PowerShell读取NFO文件

在本教程中,您已经学会了如何生成和导出MSInfo32报告。但你来找亚当自动化的原因是有原因的,所以你将学会如何自动化这个过程。

保存的NFO报告可以通过文件→打开菜单在MSInfo32中打开和查看。问题是:当自动化信息检索时,图形界面并不理想。由于NFO文件保存为XML文件,PowerShell可以解析XML文件并检索信息。

要读取XML报告文件,请打开PowerShell窗口并运行Get-Content,如下面的截图所示。 [XML]允许PowerShell读取XML文本并将其转换为PowerShell对象。最后,将结果保存到$Report变量中。生成的命令如下所示。

$Report = [XML](Get-Content -Path 'Report.nfo')
Output of the $Report variable.

也许您需要检索报告生成时正在运行的服务列表。由于MSInfo32报告包含了这些内容,您可以通过SelectNodes()方法检索列表。

SelectNodes()方法使用XPath。XPath是用于XML的查询语言。本文不涉及制作复杂的XPath查询。

<Category name="Services">
        <Data>
          <Display_Name><![CDATA[ACC Service]]></Display_Name>
          <Name><![CDATA[ACCSvc]]></Name>
          <State><![CDATA[Running]]></State>
          <Start_Mode><![CDATA[Auto]]></Start_Mode>
          <Service_Type><![CDATA[Own Process]]></Service_Type>
          <Path><![CDATA["c:\\program files (x86)\\acer\\care center\\accsvc.exe"]]></Path>
          <Error_Control><![CDATA[Normal]]></Error_Control>
          <Start_Name><![CDATA[LocalSystem]]></Start_Name>
          <Tag_ID><![CDATA[0]]></Tag_ID>
        </Data>
        <Data>
          <Display_Name><![CDATA[AllJoyn Router Service]]></Display_Name>
          <Name><![CDATA[AJRouter]]></Name>
          <State><![CDATA[Stopped]]></State>
          <Start_Mode><![CDATA[Manual]]></Start_Mode>
          <Service_Type><![CDATA[Share Process]]></Service_Type>
          <Path><![CDATA[c:\\windows\\system32\\svchost.exe -k localservicenetworkrestricted -p]]></Path>
          <Error_Control><![CDATA[Normal]]></Error_Control>
          <Start_Name><![CDATA[NT AUTHORITY\\LocalService]]></Start_Name>
          <Tag_ID><![CDATA[0]]></Tag_ID>
        </Data>
</Category>

XPath查询'//Category[@name="Software Environment"]/Category[@name="Services"]/Data'将作为示例。下面显示了其各部分,以便您理解并为多种情况进行调整。

  • //Category[@name="Software Environment"] – 返回整个文档中名称为“Software Environment”的任何Category节点,由前面的双斜杠表示。
  • /Category[@name="Services"] – 返回先前返回的“Software Environment”节点下的具有名称“Services”的Category节点。
  • /Data – 返回先前返回的“Services”节点下的子Data节点。

上面的示例结构展示了当运行MSInfo32时我们看到的自动生成的系统报告。您可以根据您在其中看到的部分进行构建。

将XPath查询//Category[@name="Software Environment"]/Category[@name="Services"]/Data传递给下面显示的$Report对象上的SelectNodes()方法将所有窗口服务作为XML节点返回。由于XML节点未显示预期的输出(服务NameDisplayNameState),下面的代码创建一个PSCustomObject并使用Format-Table将输出格式化以适合在屏幕上显示。

# 下面显示的XPath查询将根据您希望提取的数据而变化,它不总是遵循这种约定。
$Report.SelectNodes('//Category[@name="Software Environment"]/Category[@name="Services"]/Data') | ForEach-Object {
  [PSCustomObject]@{
    "Name"    = $PSItem.Name.innerText
    "Display" = $PSItem.Display_Name.innerText
    "State"   = $PSItem.State.innerText
  }
} | Format-Table -AutoSize
Selecting XML data from an NFO file.

以下是如何使用XPath查询和PowerShell查找有关系统报告显示类别的信息的另一个示例。XPath查询本身与之前的查询非常相似,但这次是查找组件和显示类别。

# 下面显示的XPath查询将根据您希望提取的数据而更改,它不总是遵循此约定
$Report.SelectNodes('//Category[@name="Components"]/Category[@name="Display"]/Data') | ForEach-Object -Begin {
	# 创建一个对象集合以保存所有设备的集合
	$Objects = [System.Collections.ArrayList]@()
	# 用于保存单个设备的名称和值的临时对象
	$Object = @()
} -Process {
	# 如果项目名称不为空,表示即将出现新设备,则将名称和值添加到临时$Object数组。
  # 之所以不能在自定义散列表中进行这项操作,是因为名称可能重复,而在散列表中是不允许的
  If (-Not [String]::IsNullOrWhiteSpace($PSItem.Item.innerText)) {
    $Object += [PSCustomObject]@{
      "Name"  = $PSItem.Item.innerText
      "Value" = $PSItem.Value.innerText
    }
  } Else {
		# 一旦遇到空白的项目名称,将其添加到总体设备列表中
    $Objects.Add($Object)
		# 重置单个设备对象
    $Object = @()
  }
} -End {
	# 仅将设备对象集合发送到管道的下游
	$Objects
} | Format-Table -AutoSize
Results of the XML query against the Display Components list.

结论

在本文中,您已经学会了如何使用MSInfo32为本地系统生成全面的系统报告。通过MSInfo32的保存和导出功能,您学会了如何导出系统状态以进行长时间分析,并使用PowerShell分析可用信息。

如何在多个系统上自动化 MSInfo32?

Source:
https://adamtheautomator.com/msinfo32/