用Windows PowerShell检测系统,硬件,驱动信息,运行跑分,附函数模组写法示例 更新5

A@NAZOrip
[email protected] 2022年02月25日
  • 在其它设备中阅读本文章

❀原创教程,转载本页必须注明链接和作者

❀目前本文档处于发布早期,会频繁更新/修bug,出问题求不锤

这套PowerShell命令行属于基础难度,方便修改,而且执行起来不比现有的软件系统检测慢。换了硬件可以拿来跑一遍跑个分,查看硬件信息,查询序列号,自带汉化,稍微改改还可以远程在别的计算机上生成报告。下面正式开始教程(っ╹◡╹)ノ

报错:若闪退,或者遇到无法加载文件,因为在此系统上禁止运行脚本。报错,可以用Get-ExecutionPolicy回车检查是否为Restricted(限制),然后用Set-ExecutionPolicy RemoteSigned恢复权限(大概需要管理员密码)即可。
(来源于简书:sinler(转载自鲸鱼啊)。

更新4:增加了存在和未知USB设备的检测步骤


代码如下,拷下来用Unicode/UTF-8编码保存为`系统检测.ps1`运行即可(⊙_◎):
clear
"检测日期: {0:dddd, MMMM dd, yyyy}" -f (Get-Date)
"计算机名: "+$env:computername+", `n"+(Get-WmiObject -class Win32_OperatingSystem).Caption

switch (Read-Host "`n运行系统跑分吗(耗时~5分钟,输入y或n后按Enter)") {
  'y' {WinSat formal}
  'n'  {"跑分跳过!"}
  default {"未输入条件!"}
}

#设定标题长20
[int]$tCenter = 28

"`n 系Windows`n 统`n 体Experience`n 验`n 跑Index`n 分(筛选最差)`n"
$ExpIdx = Get-CimInstance Win32_WinSat | Select CPUScore,D3DScore,DiskScore,GraphicsScore,WinSATAssessmentState,WinSPRLevel

#标题和居中计算
[string]$heading = "总分: "+$ExpIdx.WinSPRLevel
[int]$eCenter = $tCenter - $heading.Length/2

#输出标题和内容
"-"*$eCenter+$heading+"-"*$eCenter
"处理器得分: "+$ExpIdx.CPUScore
"2D图形得分: "+$ExpIdx.GraphicsScore
"3D图形得分: "+$ExpIdx.D3DScore
"硬盘得分:   "+$ExpIdx.DiskScore

"`n`n 主Mother`n 板board`n"
$MB = Get-WmiObject Win32_Baseboard | Select Status,Product,Manufacturer,Model,SerialNumber,Version
"名称: "+$MB.Product
"厂商: "+$MB.Manufacturer
"状况: "+$MB.Status
"型号: "+$MB.Model
"序列号: "+$MB.SerialNumber
"版本: "+$MB.Version+"`n"

"`n 中C`n 央P`n 处U`n 理`n 器`n"
$AllProcs = Get-CimInstance Win32_Processor | Select Availability,CurrentClockSpeed,MaxClockSpeed,Name,DeviceID,NumberOfCores,ThreadCount,LoadPercentage,VoltageCaps,VirtualizationFirmwareEnabled,L2CacheSize,L3CacheSize
#为多路处理器系统准备的循环
ForEach ($_ in $AllProcs) {
    #区分设备运行与供电状态
    Switch ($_.Availability) {
        2{[string]$prState = "未知"}
        3{[string]$prState = "正常"}
        4{[string]$prState = "报警中"}
        5{[string]$prState = "处于测试状态"}
        18{[string]$prState = "暂停中"}
        11{[string]$prState = "未安装"}
        12{[string]$prState = "安装错误"}
        16{[string]$prState = "重新启动中"}
        17{[string]$prState = "省电模式: 警告"}
        13{[string]$prState = "省电模式: 未知"}
        14{[string]$prState = "省电模式: 节能"}
        15{[string]$prState = "省电模式: 待机"}
        20{[string]$prState = "处理器缺少状态参数"}
        21{[string]$prState = "反馈被阻止"}
        Default{$prState = $_.Availability}
    }

    #标题和居中计算
    [string]$heading = $_.DeviceID
    [int]$eCenter = $tCenter - $heading.Length/2

    #输出标题和内容
    "-"*$eCenter+$heading+"-"*$eCenter
    "型号:        "+$_.Name
    "频率:        当前"+$_.CurrentClockSpeed+"Mhz, 最大"+$_.MaxClockSpeed+"Mhz"
    "状态:        "+$prState
    "二级缓存大小: "+$_.L2CacheSize / 1024+"MB"
    "三级缓存大小: "+$_.L3CacheSize / 1024+"MB"
    "最大工作电压: "+$_.VoltageCaps / 1000+"V"
    "当前负载:     "+$_.LoadPercentage+"%"
    "虚拟化已开:   "+$_.VirtualizationFirmwareEnabled
    ""
}

"`n 内R`n 存A`n 条M`n"
$AllMemos = Get-WmiObject -Class Win32_PhysicalMemory | Select Manufacturer,ConfiguredVoltage,MaxVoltage,PartNumber,Speed,Tag,Capacity

ForEach ($_ in $AllMemos) {
    #计算内存容量
    [int]$MemSize = $_.Capacity / 1GB

    #标题和居中计算
    [string]$heading = $_.Tag
    [int]$eCenter = $tCenter - $heading.Length/2

    #输出标题和内容
    "-"*$eCenter+$heading+"-"*$eCenter
    "容量:"+$MemSize+"GB"
    "厂商: "+$_.Manufacturer
    "型号: "+$_.PartNumber
    "频率: "+$_.Speed+"MT/s(Mbps)"
    "最大工作电压: "+$_.MaxVoltage / 1000+"V, 目前:"+$_.ConfiguredVoltage / 1000+"V"
    ""
}

"`n B`n I`n O`n S`n"
$BiosCond = Get-CimInstance Win32_BIOS | Select Status,Name,BIOSVersion,SMBIOSBIOSVersion,ReleaseDate
"名称:          "+$BiosCond.Name
"状况:          "+$BiosCond.Status
"安装BIOS版本:   "+$BiosCond.BIOSVersion
"发行日期:       "+$BiosCond.ReleaseDate
"系统用BIOS版本: "+$BiosCond.SMBIOSBIOSVersion+"`n"
"注:MSI微星BIOS版号写作如7C91vA9的数字;其中vA9代表Version A.90或其它数字"

"`n 图G`n 形P`n 处U`n 理`n 器`n"
$GPUCond = Get-WMIObject -Class Win32_VideoController | Select DeviceID,Availability,Name,DriverVersion,DriverDate,VideoModeDescription,CurrentBitsPerPixel
#为多显卡系统准备的循环
ForEach ($_ in $GPUCond) {
    #区分设备运行与供电状态
    Switch ($_.Availability) {
        2{[string]$prState = "未知"}
        3{[string]$prState = "正常"}
        4{[string]$prState = "报警中"}
        5{[string]$prState = "处于测试状态"}
        18{[string]$prState = "暂停中"}
        11{[string]$prState = "未安装"}
        12{[string]$prState = "安装错误"}
        16{[string]$prState = "重新启动中"}
        17{[string]$prState = "省电模式: 警告"}
        13{[string]$prState = "省电模式: 未知"}
        14{[string]$prState = "省电模式: 节能"}
        15{[string]$prState = "省电模式: 待机"}
        20{[string]$prState = "处理器缺少状态参数"}
        21{[string]$prState = "反馈被阻止"}
        Default{$prState = $_.Availability}
    }

    #标题和居中计算
    [string]$heading = $_.DeviceID+": "+$_.Name
    [int]$eCenter = $tCenter - $heading.Length/2

    #输出标题和内容
    "-"*$eCenter+$heading+"-"*$eCenter
    "状态: $prState"
    "驱动: Ver"+$_.DriverVersion+", 发布于"+$_.DriverDate
    "显示方案: "+$_.VideoModeDescription
    "显示位深: "+$_.CurrentBitsPerPixel+"bit"
    ""
}

"`n 物Physical`n 理`n 硬Disk`n 盘`n"
$DiskPhc = Get-Disk | Select DiskNumber,PartitionStyle,HealthStatus,FirmwareVersion,FriendlyName,SerialNumber,Size,AllocatedSize,Location
ForEach ($_ in $DiskPhc) {

    #标题和居中计算
    [string]$heading = "盘"+$_.DiskNumber+": "+$_.FriendlyName
    [int]$eCenter = $tCenter - $heading.Length/2

    #输出标题和内容
    "-"*$eCenter+$heading+"-"*$eCenter
    "分区表:   "+$_.PartitionStyle
    "序列号:   "+$_.SerialNumber
    "固件版本: "+$_.FirmwareVersion
    "设定容量: {0:n0}GB" -f($_.AllocatedSize / 1GB)
    "实际容量: {0:n0}GB" -f($_.Size / 1GB)
    "健康状况: "+$_.HealthStatus
    "接口位置: "+$_.Location
    ""
}

"`n 逻Logical`n 辑`n 磁Disk`n 盘`n"
$DiskLgc = Get-WMIObject -Class Win32_LogicalDisk | Select FileSystem,DeviceID,Description,Size,FreeSpace,VolumeName

ForEach ($_ in $DiskLgc) {
    if (!$_.FileSystem) {$DriveSys = "Not Available"}
        else {$DriveSys = $_.FileSystem}

    #标注空的逻辑磁盘
    if (!$_.Size) {$Capacity = "不可用(N/A)"; $DiskSpace = "不可用(N/A)"}
    else {
        $Capacity = "{0:n1}GB" -f($_.Size / 1GB)
        $DiskSpace ="{0:n1}GB" -f($_.FreeSpace / 1GB)
    }

    #标题和居中计算
    [string]$heading = "$DiskType"+$_.DeviceID+" "+$_.DiskNumber+$_.VolumeName
    [int]$eCenter = $tCenter - $heading.Length/2

    #输出标题和内容
    "-"*$eCenter+$heading+"-"*$eCenter
    "磁盘类型: "+$_.Description
    "文件系统: $DriveSys"
    "容量:    $Capacity"
    "剩余容量: $DiskSpace"
    ""
}

"`n U`n S`n B`n"
Get-PnpDevice -Class USB -FriendlyName *USB* -Status OK `
 | Sort-Object -Unique FriendlyName `
 | Format-Table -AutoSize @{l='本机的USB设备';e='FriendlyName'},@{l='硬件实例ID';e='InstanceId'}

Get-PnpDevice -Class USB -FriendlyName *USB* -Status Unknown `
 | Sort-Object -Unique FriendlyName `
 | Format-Table -AutoSize @{l='未知的USB设备(系统迁徙或旧设备残留)';e='FriendlyName'},@{l='硬件实例ID';e='InstanceId'}
if ($?) {"Get-PnpDevice 检测到未知设备残留,可以使用SPOOCQ - ghostbuster清理`n"} else {"Get-PnpDevice 未检测到残留,系统很干净哦`n"}

"`n AMD   驱`n Intel 动`n NVIDIA"
Get-WmiObject Win32_PnPSignedDriver `
 | Select-Object DeviceName,DriverVersion,DriverDate `
 | Where-Object {($_.DriverDate -ne $null) -and $_.DeviceName -cmatch 'AMD' -or $_.DeviceName -cmatch 'Radeon' -or $_.DeviceName -cmatch 'Intel' -or $_.DeviceName -cmatch 'NVIDIA'} `
 | Sort-Object -Unique DriverDate `
 | Format-Table -AutoSize @{l='硬件';e='DeviceName'},@{l='驱动版本';e='DriverVersion';a='Right'},@{l='编译日期';e={(Get-WmiObject -Class Win32_OperatingSystem).ConvertToDateTime($_.DriverDate).ToString('yyyy年MM月dd日')};a='Right'} -DisplayError

"`n AMD   软`n Intel 件`n NVIDIA"
Get-WmiObject -Class Win32_Product `
 | Select-Object Name,Version `
 | Where-Object {$_.Name -cmatch 'AMD' -or $_.Name -cmatch 'Intel' -or $_.Name -cmatch 'NVIDIA'} `
 | Sort-Object -Unique Version `
 | Format-Table -Autosize @{l='软件';e='Name'},@{l='软件版本';e='Version';a='Right'} -DisplayError

pause

    符合PowerShell函数模块格式标准(大概)的写法也不能少。分为后缀.psm1的模块及.psd1的清单文件,默认放于$HOME\Documents\PowerShell\Modules下;用时打开PowerShell输入Import-Module xx.psm1,然后调用里面的函数就能跑了。
这个函数改版将运行系统跑分的选项从Read-host改成了输入参数,默认否,也是做参考用的

Function Get-myPC {
<#
.Synopsis
列出本电脑系统及所有硬件的信息。

.Description
使用Get-myPC函数获取计算机名,Windows版本,Windows体验指数跑分,以及主板,处理器,内存条,BIOS,显卡,物理磁盘和逻辑磁盘的详细信息。

Get-myPC函数不需要参数,直接输入即运行。输入-Runbenchmark y以运行跑分,参数值默认为n,代表跳过。

举例,输入Get-myPC函数并回车,该函数随即自动列出本电脑系统及所有硬件的信息。

举例,输入Get-myPC -Runbenchmark y并回车,该函数随即运行Windows体验指数性能跑分,并列出本电脑系统及所有硬件的信息。

.Example
Get-myPC
    检测日期: 星期五, 四月 01, 2022
    计算机名: R5-2600, 
    Microsoft Windows 10 企业版 LTSC
    跑分跳过!

     系Windows
     统
     体Experience
     验
     跑Index
     分(筛选最差)

    ----------------总分: 8.9----------------
    处理器得分: 9.5
    2D图形得分: 9.9
    3D图形得分: 9.9
    硬盘得分:   8.9

     主Mother
     板board

    名称: X470 AORUS ULTRA GAMING-CF
    厂商: Gigabyte Technology Co., Ltd.
    状况: OK
    型号: 
    序列号: Default string
    版本: Default string
    ---后来输出内容省略---

.Example
Get-myPC -Runbenchmark y
    检测日期: 星期五, 四月 01, 2022
    计算机名: R5-2600, 
    Microsoft Windows 10 企业版 LTSC

     系Windows
     统
     体Experience
     验
     跑Index
     分(筛选最差)

    ----------------总分: 8.9----------------
    处理器得分: 9.5
    2D图形得分: 9.9
    3D图形得分: 9.9
    硬盘得分:   8.9

     主Mother
     板board

    名称: X470 AORUS ULTRA GAMING-CF
    厂商: Gigabyte Technology Co., Ltd.
    状况: OK
    型号: 
    序列号: Default string
    版本: Default string
    ---后来输出内容省略---
#>
    "检测日期: {0:dddd, MMMM dd, yyyy}" -f (Get-Date)
    "计算机名: "+$env:computername+", "+(Get-WmiObject -class Win32_OperatingSystem).Caption

    Param([string]$Runbenchmark = "n")
    switch ($Runbenchmark) {
        'y' {WinSat formal}
        'n'  {"跑分跳过!"}
        default {"未输入条件!"}
    }

    #设定标题长20
    [int]$tCenter = 28

    "`n 系Windows`n 统`n 体Experience`n 验`n 跑Index`n 分(筛选最差)`n"
    $ExpIdx = Get-CimInstance Win32_WinSat | Select CPUScore,D3DScore,DiskScore,GraphicsScore,WinSATAssessmentState,WinSPRLevel

    #标题和居中计算
    [string]$heading = "总分: "+$ExpIdx.WinSPRLevel
    [int]$eCenter = $tCenter - $heading.Length/2

    #输出标题和内容
    "-"*$eCenter+$heading+"-"*$eCenter
    "处理器得分: "+$ExpIdx.CPUScore
    "2D图形得分: "+$ExpIdx.GraphicsScore
    "3D图形得分: "+$ExpIdx.D3DScore
    "硬盘得分:   "+$ExpIdx.DiskScore

    "`n`n 主Mother`n 板board`n"
    $MB = Get-WmiObject Win32_Baseboard | Select Status,Product,Manufacturer,Model,SerialNumber,Version
    "名称: "+$MB.Product
    "厂商: "+$MB.Manufacturer
    "状况: "+$MB.Status
    "型号: "+$MB.Model
    "序列号: "+$MB.SerialNumber
    "版本: "+$MB.Version+"`n"

    "`n 中C`n 央P`n 处U`n 理`n 器`n"
    $AllProcs = Get-CimInstance Win32_Processor | Select Availability,CurrentClockSpeed,MaxClockSpeed,Name,DeviceID,NumberOfCores,ThreadCount,LoadPercentage,VoltageCaps,VirtualizationFirmwareEnabled
    #为多路处理器系统准备的循环
    ForEach ($_ in $AllProcs) {
        #区分设备运行与供电状态
        Switch ($_.Availability) {
            2{[string]$prState = "未知"}
            3{[string]$prState = "正常"}
            4{[string]$prState = "报警中"}
            5{[string]$prState = "处于测试状态"}
            18{[string]$prState = "暂停中"}
            11{[string]$prState = "未安装"}
            12{[string]$prState = "安装错误"}
            16{[string]$prState = "重新启动中"}
            17{[string]$prState = "省电模式: 警告"}
            13{[string]$prState = "省电模式: 未知"}
            14{[string]$prState = "省电模式: 节能"}
            15{[string]$prState = "省电模式: 待机"}
            20{[string]$prState = "处理器缺少状态参数"}
            21{[string]$prState = "反馈被阻止"}
            Default{$prState = $_.Availability}
        }

        #标题和居中计算
        [string]$heading = $_.DeviceID
        [int]$eCenter = $tCenter - $heading.Length/2

        #输出标题和内容
        "-"*$eCenter+$heading+"-"*$eCenter
        "型号:        "+$_.Name
        "频率:        当前"+$_.CurrentClockSpeed+"Mhz, 最大"+$_.MaxClockSpeed+"Mhz"
        "状态:        "+$prState
        "二级缓存大小: "+$_.L2CacheSize / 1024+"MB"
        "三级缓存大小: "+$_.L3CacheSize / 1024+"MB"
        "最大工作电压: "+$_.VoltageCaps / 1000+"V"
        "当前负载:     "+$_.LoadPercentage+"%"
        "虚拟化已开:   "+$_.VirtualizationFirmwareEnabled
        ""
    }

    "`n 内R`n 存A`n 条M`n"
    $AllMemos = Get-WmiObject -Class Win32_PhysicalMemory | Select Manufacturer,ConfiguredVoltage,MaxVoltage,PartNumber,Speed,Tag,Capacity

    ForEach ($_ in $AllMemos) {
        #计算内存容量
        [int]$MemSize = $_.Capacity / 1GB

        #标题和居中计算
        [string]$heading = $_.Tag
        [int]$eCenter = $tCenter - $heading.Length/2

        #输出标题和内容
        "-"*$eCenter+$heading+"-"*$eCenter
        "容量:"+$MemSize+"GB"
        "厂商: "+$_.Manufacturer
        "型号: "+$_.PartNumber
        "频率: "+$_.Speed+"MT/s(Mbps)"
        "最大工作电压: "+$_.MaxVoltage / 1000+"V, 目前:"+$_.ConfiguredVoltage / 1000+"V"
        ""
    }

    "`n B`n I`n O`n S`n"
    $BiosCond = Get-CimInstance Win32_BIOS | Select Status,Name,BIOSVersion,SMBIOSBIOSVersion,ReleaseDate
    "名称:          "+$BiosCond.Name
    "状况:          "+$BiosCond.Status
    "安装BIOS版本:   "+$BiosCond.BIOSVersion
    "发行日期:       "+$BiosCond.ReleaseDate
    "系统用BIOS版本: "+$BiosCond.SMBIOSBIOSVersion+"`n"
    "注:MSI微星BIOS版号写作如7C91vA9的数字;其中vA9代表Version A.90或其它数字"

    "`n 图G`n 形P`n 处U`n 理`n 器`n"
    $GPUCond = Get-WMIObject -Class Win32_VideoController | Select DeviceID,Availability,Name,DriverVersion,DriverDate,VideoModeDescription,CurrentBitsPerPixel
    #为多显卡系统准备的循环
    ForEach ($_ in $GPUCond) {
        #区分设备运行与供电状态
        Switch ($_.Availability) {
            2{[string]$prState = "未知"}
            3{[string]$prState = "正常"}
            4{[string]$prState = "报警中"}
            5{[string]$prState = "处于测试状态"}
            18{[string]$prState = "暂停中"}
            11{[string]$prState = "未安装"}
            12{[string]$prState = "安装错误"}
            16{[string]$prState = "重新启动中"}
            17{[string]$prState = "省电模式: 警告"}
            13{[string]$prState = "省电模式: 未知"}
            14{[string]$prState = "省电模式: 节能"}
            15{[string]$prState = "省电模式: 待机"}
            20{[string]$prState = "处理器缺少状态参数"}
            21{[string]$prState = "反馈被阻止"}
            Default{$prState = $_.Availability}
        }

        #标题和居中计算
        [string]$heading = $_.DeviceID+": "+$_.Name
        [int]$eCenter = $tCenter - $heading.Length/2

        #输出标题和内容
        "-"*$eCenter+$heading+"-"*$eCenter
        "状态: $prState"
        "驱动: Ver"+$_.DriverVersion+", 发布于"+$_.DriverDate
        "显示方案: "+$_.VideoModeDescription
        "显示位深: "+$_.CurrentBitsPerPixel+"bit"

    }

    "`n 物Physical`n 理`n 硬Disk`n 盘`n"
    $DiskPhc = Get-Disk | Select DiskNumber,PartitionStyle,HealthStatus,FirmwareVersion,FriendlyName,SerialNumber,Size,AllocatedSize,Location
    ForEach ($_ in $DiskPhc) {

        #标题和居中计算
        [string]$heading = "盘"+$_.DiskNumber+": "+$_.FriendlyName
        [int]$eCenter = $tCenter - $heading.Length/2

        #输出标题和内容
        "-"*$eCenter+$heading+"-"*$eCenter
        "分区表:   "+$_.PartitionStyle
        "序列号:   "+$_.SerialNumber
        "固件版本: "+$_.FirmwareVersion
        "设定容量: {0:n0}GB" -f($_.AllocatedSize / 1GB)
        "实际容量: {0:n0}GB" -f($_.Size / 1GB)
        "健康状况: "+$_.HealthStatus
        "接口位置: "+$_.Location
        ""
    }

    "`n 逻Logical`n 辑`n 磁Disk`n 盘`n"
    $DiskLgc = Get-WMIObject -Class Win32_LogicalDisk | Select FileSystem,DeviceID,Description,Size,FreeSpace,VolumeName

    ForEach ($_ in $DiskLgc) {
        if (!$_.FileSystem) {$DriveSys = "Not Available"}
            else {$DriveSys = $_.FileSystem}

        #标注空的逻辑磁盘
        if (!$_.Size) {$Capacity = "不可用(N/A)"; $DiskSpace = "不可用(N/A)"}
        else {
            $Capacity = "{0:n1}GB" -f($_.Size / 1GB)
            $DiskSpace ="{0:n1}GB" -f($_.FreeSpace / 1GB)
        }

        #标题和居中计算
        [string]$heading = "$DiskType"+$_.DeviceID+" "+$_.DiskNumber+$_.VolumeName
        [int]$eCenter = $tCenter - $heading.Length/2

        #输出标题和内容
        "-"*$eCenter+$heading+"-"*$eCenter
        "磁盘类型: "+$_.Description
        "文件系统: $DriveSys"
        "容量:    $Capacity"
        "剩余容量: $DiskSpace"
        ""
    }

    "`n U`n S`n B`n"
    Get-PnpDevice -Class USB -FriendlyName *USB* -Status OK `
     | Sort-Object -Unique FriendlyName `
     | Format-Table -AutoSize @{l='本机的USB设备';e='FriendlyName'},@{l='硬件实例ID';e='InstanceId'}

    Get-PnpDevice -Class USB -FriendlyName *USB* -Status Unknown `
     | Sort-Object -Unique FriendlyName `
     | Format-Table -AutoSize @{l='未知的USB设备(系统迁徙或旧设备残留)';e='FriendlyName'},@{l='硬件实例ID';e='InstanceId'}
    if ($?) {"Get-PnpDevice 检测到未知设备残留,可以使用SPOOCQ - ghostbuster清理`n"} else {"Get-PnpDevice 未检测到残留,系统很干净哦`n"}

    "`n AMD   驱`n Intel 动`n NVIDIA"
    Get-WmiObject Win32_PnPSignedDriver `
     | Select-Object DeviceName,DriverVersion,DriverDate `
     | Where-Object {($_.DriverDate -ne $null) -and $_.DeviceName -cmatch 'AMD' -or $_.DeviceName -cmatch 'Radeon' -or $_.DeviceName -cmatch 'Intel' -or $_.DeviceName -cmatch 'NVIDIA'} `
     | Sort-Object -Unique DriverDate `
     | Format-Table -AutoSize @{l='硬件';e='DeviceName'},@{l='驱动版本';e='DriverVersion';a='Right'},@{l='编译日期';e={(Get-WmiObject -Class Win32_OperatingSystem).ConvertToDateTime($_.DriverDate).ToString('yyyy年MM月dd日')};a='Right'} -DisplayError

    "`n AMD   软`n Intel 件`n NVIDIA"
    Get-WmiObject -Class Win32_Product `
     | Select-Object Name,Version `
     | Where-Object {$_.Name -cmatch 'AMD' -or $_.Name -cmatch 'Intel' -or $_.Name -cmatch 'NVIDIA'} `
     | Sort-Object -Unique Version `
     | Format-Table -Autosize @{l='软件';e='Name'},@{l='软件版本';e='Version';a='Right'} -DisplayError
}
Get-myPC.psm1

搭配下方的Get-myPC.psd1(放于同目录), 用Import-Module Get-myPC.psm1; Get-myPC运行。

清单文件译自Manifest file,用于限制最低引擎版本(新PowerShell加的参数在旧版没有),锚定函数运行所需的文件(否则要自己写检测功能),注明版权和来源等方便大体积,多文件函数模组用的。以下主要为了提供例子方便后来人照搬了,正常直接用上面那段就够了。

以下清单通过New-ModuleManifest Get-myPC.psd1生成源,再修改一些默认值就写出来了。由于系统语言是中文,所以才会给出中文的清单:

#
# 模块“Get-myPC”的模块清单
#
# 生成者: iAvoe ([email protected])
#
# 生成时间: 2022/2/15
#

@{

# 与此清单关联的脚本模块或二进制模块文件。
RootModule = 'Get-myPC.psm1'

# 此模块的版本号。
ModuleVersion = '2.0'

# 支持的 PSEditions
# CompatiblePSEditions = @()

# 用于唯一标识此模块的 ID
GUID = '8d011647-95d5-4fca-ac7e-7cae5f9d74de'

# 此模块的作者
Author = 'iAvoe ([email protected])'

# 此模块所属的公司或供应商
CompanyName = 'Nazorip'

# 此模块的版权声明
Copyright = '(c) 2022 iAvoe ([email protected])。保留所有权利。'

# 此模块所提供功能的说明
Description = '使用Get-myPC函数获取计算机名,Windows版本,Windows体验指数跑分,以及主板,处理器,内存条,BIOS,显卡,物理磁盘和逻辑磁盘的详细信息。'

# 此模块要求的 Windows PowerShell 引擎的最低版本
PowerShellVersion = '2.0'

# 此模块要求的 Windows PowerShell 主机的名称
# PowerShellHostName = ''

# 此模块要求的 Windows PowerShell 主机的最低版本
# PowerShellHostVersion = ''

# 此模块要求使用的最低 Microsoft .NET Framework 版本。此先决条件仅对 PowerShell Desktop 版本有效。
# DotNetFrameworkVersion = ''

# 此模块要求使用的最低公共语言运行时(CLR)版本。此先决条件仅对 PowerShell Desktop 版本有效。
# CLRVersion = ''

# 此模块要求的处理器体系结构(无、X86、Amd64)
# ProcessorArchitecture = ''

# 必须在导入此模块之前先导入全局环境中的模块
# RequiredModules = @()

# 导入此模块之前必须加载的程序集
# RequiredAssemblies = @()

# 导入此模块之前运行在调用方环境中的脚本文件(.ps1)。
# ScriptsToProcess = @()

# 导入此模块时要加载的类型文件(.ps1xml)
# TypesToProcess = @()

# 导入此模块时要加载的格式文件(.ps1xml)
# FormatsToProcess = @()

# 将作为 RootModule/ModuleToProcess 中所指定模块的嵌套模块导入的模块
# NestedModules = @()

# 要从此模块中导出的函数。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的函数,请使用空数组。
FunctionsToExport = @('Get-myPC')

# 要从此模块中导出的 cmdlet。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的 cmdlet,请使用空数组。
CmdletsToExport = @()

# 要从此模块中导出的变量
VariablesToExport = '*'

# 要从此模块中导出的别名。为了获得最佳性能,请不要使用通配符,不要删除该条目。如果没有要导出的别名,请使用空数组。
AliasesToExport = @()

# 要从此模块导出的 DSC 资源
# DscResourcesToExport = @()

# 与此模块一起打包的所有模块的列表
# ModuleList = @()

# 与此模块一起打包的所有文件的列表
FileList = @('Get-myPC.psm1')

# 要传递到 RootModule/ModuleToProcess 中指定的模块的专用数据。这还可能包含 PSData 哈希表以及 PowerShell 使用的其他模块元数据。
PrivateData = @{

    PSData = @{

        # 应用于此模块的标记。这些标记有助于在联机库中执行模块发现。
        # Tags = @()

        # 指向此模块的许可证的 URL。
        # LicenseUri = ''

        # 指向此项目的主网站的 URL。
        # ProjectUri = ''

        # 指向表示此模块的图标的 URL。
        # IconUri = ''

        # 此模块的 ReleaseNotes
        # ReleaseNotes = ''

    } # PSData 哈希表末尾

} # PrivateData 哈希表末尾

# 此模块的 HelpInfo URI
# HelpInfoURI = ''

# 从此模块中导出的命令的默认前缀。可以使用 Import-Module -Prefix 覆盖默认前缀。
# DefaultCommandPrefix = ''

}
Get-myPC.psd1

Powershell做不到实时监测CPU每个线程的占用,也不能测试内存稳定性。实现方法太难...
PS: 其实吧,这东西的最大用处还是在硬件论坛提问的时候生成个硬件信息报告...

更新了供电状态powerstate参数, 以及CPU L2, L3缓存大小. 那么就这样

打赏信息

在线丢人,求个打赏,支持一下T_T
pp_tip_qrcode.png