Skip to content

补全组件:系统镜像没有 KeyHashes 时不再抛异常,校验出错写进日志 - #121

Merged
qiyinxi merged 1 commit into
ModAVD:mainfrom
qiyinxi:fix/fetch-keyhashes-118
Nov 5, 2026
Merged

qiyinxi merged 1 commit into
ModAVD:mainfrom
qiyinxi:fix/fetch-keyhashes-118

Conversation

@qiyinxi

@qiyinxi qiyinxi commented Nov 5, 2026

Copy link
Copy Markdown
Member

修 #118:0.37.0–0.38.0 的「补全组件.bat」第一次装系统镜像必然失败,报「解压后的关键文件或版本校验失败」。

原因

  • package/fetch-components.ps1 开着 Set-StrictMode -Version 2。
  • Test-ComponentFiles 用 if ($C.KeyHashes) 判断要不要比哈希。组件表里只有平台工具有这个键,系统镜像那一项没有。严格模式下取哈希表里不存在的键会抛 PropertyNotFoundException(Windows PowerShell 5.1 和 pwsh 7 都一样)。
  • 这个异常被 catch { return $false } 吞掉了,所以系统镜像的校验永远不过。四个关键文件其实都在,大小也对。

改了什么

只改这一个文件的两处,别的不动:

  • 第 318 行改成 if ($C.ContainsKey('KeyHashes'))。平台工具照旧核对钉住的哈希和版本号,系统镜像照旧只核对关键文件。
  • catch 里先把异常写进 logs\fetch-components.log(「校验 <组件> 时出错:<原因>」),再照旧返回不齐全。以后再出这类问题,日志里能看到原因。

文件照旧是 UTF-8 带 BOM、CRLF,其余字节不变。三个 .bat 和另外两个脚本都不动。批处理改调命令行的 #119 留到 0.39。

测过什么

  • 函数级:把 Test-ComponentFiles 从脚本里取出来,在严格模式下跑。Windows PowerShell 5.1 和 pwsh 7.6 各一遍:
    • 系统镜像(没有 KeyHashes):修好以后返回 True;
    • 平台工具:哈希对返回 True,哈希不对返回 False;
    • 变异检查:把第 318 行改回原来的写法,系统镜像又变成 False,同时日志里记下了 The property 'KeyHashes' cannot be found on this object,说明新加的那行日志有用。
  • 从空实测:用 0.38.0 正式包的批处理、tools\modavd.exe 和 emulator.exe,换上修好的脚本,在新的根目录里跑 新加 fetch 项:新根目录从空补全组件(命令行和补全组件.bat) ModAVDE2E#12 的 fetch 项:
    • pass:true;批处理那遍走的就是这个脚本,Windows PowerShell 5.1,输入 y 同意许可协议;
    • 平台工具和系统镜像都装好了,退出码 0;
    • 再运行一次批处理,两样都显示「已有…跳过」。
    • 对照:同一项拿原样的 0.38.0 包跑是 pass:false,系统镜像没装上。
  • 两个版本的 PowerShell 解析都没有错误。

Refs #118

fetch-components.ps1 开着 StrictMode 2,Test-ComponentFiles 用 $C.KeyHashes 判断要不要比哈希;
系统镜像那一项没有这个键,取值抛异常、被 catch 吞掉,系统镜像的校验永远不过。
改成 $C.ContainsKey('KeyHashes');catch 里把异常写进 fetch-components.log。

Refs ModAVD#118
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant