From 762c35872170d889318b20c709f9bab2a110b2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=B8=AD=E9=B8=AD=E3=80=8C=E3=82=AB=E3=83=A2=E3=80=8D?= <89643991+DuckDuckStudio@users.noreply.github.com> Date: Tue, 10 Mar 2026 03:47:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(verify):=20=E8=BF=98=E4=BB=8E=20\SOFTW?= =?UTF-8?q?ARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\=20?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E5=AE=89=E8=A3=85=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tools/verify.py | 47 +++++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/src/tools/verify.py b/src/tools/verify.py index 5627ca0..5ede38b 100644 --- a/src/tools/verify.py +++ b/src/tools/verify.py @@ -7,6 +7,7 @@ import winreg import shutil import subprocess +from typing import Any from colorama import Fore from catfood.functions.print import 消息头 from function.github.token import read_token @@ -210,20 +211,24 @@ def 测试安装与卸载(清单目录: str, 操作: str) -> int: return 0 -def 读取AAF字段(): - # 机器范围 AAF: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ - # 用户范围 AAF: 计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Uninstall\ - # 此函数皆在实现获取机器/用户范围的 AAF,并返回获取到的结果 - # 对应清单中的 AppsAndFeaturesEntries +def 读取AAF字段() -> list[dict[str, str | int]]: + """ + 此函数从注册表的 `HKEY_LOCAL_MACHINE` (机器范围) 和 `HKEY_CURRENT_USER` (用户范围) 下的以下两处读取安装信息(对应清单中的 `AppsAndFeaturesEntries` 字段)。 + - `\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\` + - `\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\` + + :return: 读取到的字段列表 + :rtype: list[dict[str, str | int]] + """ # 定义关心的字段列表 - 关心的字段 = [ + 关心的字段: list[str] = [ "DisplayName", "DisplayVersion", "Publisher", "UninstallString", "HelpLink", "InstallLocation", "SystemComponent", "WindowsInstaller", "NoRemove", "NoModify", "InstallSource", "EstimatedSize", "URLInfoAbout", "Comments" ] - def _读取注册表值(键: winreg.HKEYType, 值名: str): + def _读取注册表值(键: winreg.HKEYType, 值名: str) -> Any | str | None: try: 值, 注册类型 = winreg.QueryValueEx(键, 值名) if 注册类型 == winreg.REG_EXPAND_SZ: @@ -239,7 +244,7 @@ def _读取注册表值(键: winreg.HKEYType, 值名: str): except FileNotFoundError: return None - def _读取注册表条目(hive: int, subkey: str, access: int=0): + def _读取注册表条目(hive: int, subkey: str, access: int=0) -> list[dict[str, str | int]]: entries: list[dict[str, str | int]] = [] try: with winreg.ConnectRegistry(None, hive) as reg: @@ -270,25 +275,13 @@ def _读取注册表条目(hive: int, subkey: str, access: int=0): 所有条目: list[dict[str, str | int]] = [] - # 读取机器范围 (64位和32位) - WOW - 所有条目.extend(_读取注册表条目( - winreg.HKEY_LOCAL_MACHINE, - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", - winreg.KEY_WOW64_64KEY - )) - - 所有条目.extend(_读取注册表条目( - winreg.HKEY_LOCAL_MACHINE, - "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", - winreg.KEY_WOW64_32KEY - )) - - # 读取用户范围 - 所有条目.extend(_读取注册表条目( - winreg.HKEY_CURRENT_USER, - "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall" - )) - + for scope in (winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_CURRENT_USER): + for regPath in ( + "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall", + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall" + ): + 所有条目.extend(_读取注册表条目(scope, regPath, winreg.KEY_WOW64_64KEY if scope == winreg.HKEY_LOCAL_MACHINE else 0)) + return 所有条目 def 转换AAF条目为YAML(AAF条目: dict[str, str | int]): From 9286557b22152477be25269b4f67364c6b58e61d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=B8=AD=E9=B8=AD=E3=80=8C=E3=82=AB=E3=83=A2=E3=80=8D?= <89643991+DuckDuckStudio@users.noreply.github.com> Date: Fri, 20 Mar 2026 18:05:03 +0800 Subject: [PATCH 2/2] fix import --- src/tools/verify.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/tools/verify.py b/src/tools/verify.py index 5ede38b..0409ac3 100644 --- a/src/tools/verify.py +++ b/src/tools/verify.py @@ -1,22 +1,25 @@ -import re -import os import csv -import json -import yaml import ctypes -import winreg +import json +import os +import re import shutil import subprocess +import winreg from typing import Any -from colorama import Fore + +import yaml from catfood.functions.print import 消息头 -from function.github.token import read_token -from function.maintain.config import 读取配置 +from colorama import Fore from pygments import highlight # pyright: ignore[reportUnknownVariableType] -from pygments.lexers import YamlLexer # pyright: ignore[reportUnknownVariableType] -from pygments.formatters import TerminalFormatter +from pygments.formatters.terminal import TerminalFormatter +from pygments.lexers.data import YamlLexer # pyright: ignore[reportMissingTypeStubs] + from function.constant.paths import VERIFY_TEMP_DIR -from function.files.manifest import 获取清单目录, 获取PR清单 +from function.files.manifest import 获取PR清单, 获取清单目录 +from function.github.token import read_token +from function.maintain.config import 读取配置 + def main(args: list[str]) -> int: # 初始化